Menerapkan shutdown dinamis melibatkan pengkabelan aliran data dan menjalankan proses dinamis seperti yang dijelaskan 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) saat 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 memerlukan hwservicemanager
untuk 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 untuk memberi sinyal init
untuk membuka dan menurunkan antarmuka perangkat keras tertentu. Saat layanan diminta dan tidak terdaftar, hwservicemanager
meminta layanan dimulai. Namun, HAL dinamis tidak memerlukan penggunaan semua ini.
Menentukan keluar HAL
Di Android 9, 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 harus memulai HAL dan kapan harus mematikan HAL. Jika HAL memutuskan untuk keluar karena alasan apa pun, HAL akan dimulai ulang secara otomatis saat dibutuhkan lagi menggunakan informasi yang diberikan dalam definisi HAL dan infrastruktur yang disediakan oleh perubahan pada init
dan hwservicemanager
. Ini dapat melibatkan beberapa strategi yang berbeda, termasuk:
- HAL dapat memilih untuk memanggil exit dengan sendirinya jika seseorang memanggil API yang mirip atau mirip dengannya. 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 ke kernel dan hwservicemanager
, yang memungkinkan HAL dimatikan secara otomatis kapan pun mereka tidak memiliki klien. Untuk menggunakan fitur ini, lakukan semua langkah di Perubahan definisi HAL serta:
- Daftarkan layanan di 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 dengan
hwservicemanager
) hanya ketika sedang digunakan. Untuk menghindari penundaan jika referensi ini dijatuhkan pada utas hwbinder yang terus dijalankan, klien juga harus memanggilIPCThreadState::self()->flushCommands()
setelah menjatuhkan referensi untuk memastikan bahwa driver pengikat diberitahu tentang jumlah referensi terkait perubahan.