Menerapkan pematian dinamis melibatkan pengkabelan aliran data dan menjalankan proses dinamis sebagaimana dirinci di bagian berikut.
Perubahan definisi HAL
Shutdown dinamis memerlukan informasi tentang proses mana yang melayani antarmuka HAL (informasi ini mungkin juga berguna nanti dalam konteks lain) serta tidak memulai proses saat boot dan tidak memulai ulang (sampai diminta lagi) ketika proses tersebut keluar.
# some init.rc script associated with the HAL service vendor.some-service-name /vendor/bin/hw/some-binary-service # init language extension, provides information of what service is served # if multiple interfaces are served, they can be specified one on each line interface android.hardware.light@2.0::ILight default # restarted if hwservicemanager dies # would also cause the hal to start early during boot if disabled wasn't set class hal # will not be restarted if it exits until it is requested to be restarted oneshot # will only be started when requested disabled # ... other properties
Perubahan pada init dan hwservicemanager
Shutdown dinamis juga mengharuskan hwservicemanager
memberi tahu init
untuk memulai layanan yang diminta. Di Android 9, init
menyertakan tiga pesan kontrol tambahan (misalnya ctl.start
): ctl.interface_start
, ctl.interface_stop
, dan ctl.interface_restart
. Pesan-pesan ini dapat digunakan sebagai sinyal init
untuk menaikkan dan menurunkan antarmuka perangkat keras tertentu. Ketika layanan diminta dan tidak terdaftar, hwservicemanager
meminta layanan tersebut dimulai. Namun, HAL dinamis tidak memerlukan penggunaan semua ini.
Tentukan pintu keluar HAL
Di Android 9, pintu keluar HAL harus ditentukan secara manual. Untuk Android 10 dan lebih tinggi, ini juga dapat ditentukan dengan siklus hidup otomatis .
Shutdown dinamis memerlukan beberapa kebijakan untuk memutuskan kapan memulai HAL dan kapan mematikan HAL. Jika HAL memutuskan untuk keluar karena alasan apa pun, maka secara otomatis akan dimulai ulang ketika diperlukan lagi menggunakan informasi yang diberikan dalam definisi HAL dan infrastruktur yang disediakan oleh perubahan pada init
dan hwservicemanager
. Hal ini dapat melibatkan beberapa strategi berbeda, termasuk:
- HAL dapat memilih untuk memanggil exit sendiri jika seseorang memanggil API yang mirip atau serupa di dalamnya. Perilaku ini harus ditentukan dalam antarmuka HAL yang sesuai.
- HAL dapat dimatikan ketika tugasnya selesai (didokumentasikan dalam file HAL).
Siklus hidup otomatis
Android 10 menambahkan lebih banyak dukungan pada kernel dan hwservicemanager
, yang memungkinkan HAL dimatikan secara otomatis setiap kali mereka tidak memiliki klien. Untuk menggunakan fitur ini, lakukan semua langkah dalam Perubahan definisi HAL serta:
- Daftarkan layanan dalam C++ dengan
LazyServiceRegistrar
alih-alih fungsi anggota,registerAsService
, misalnya:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- Verifikasi bahwa klien HAL menyimpan referensi ke HAL tingkat atas (antarmuka yang terdaftar
hwservicemanager
) hanya saat sedang digunakan. Untuk menghindari penundaan jika referensi ini dihapus pada thread hwbinder yang terus dijalankan, klien juga harus memanggilIPCThreadState::self()->flushCommands()
setelah menghapus referensi untuk memastikan bahwa driver binder diberitahu tentang jumlah referensi terkait perubahan.