Mengimplementasikan penonaktifan dinamis melibatkan penyambungan alur data dan menjalankan proses dinamis seperti yang dijelaskan di bagian berikut.
Perubahan pada definisi HAL
Penonaktifan dinamis memerlukan informasi tentang proses yang melayani antarmuka HAL apa (informasi ini juga dapat berguna nanti dalam konteks lain) serta tidak memulai proses saat booting dan tidak memulai ulang proses tersebut (hingga 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
Penonaktifan 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 ini dapat digunakan untuk memberi sinyal init
untuk menampilkan dan menyembunyikan
antarmuka hardware tertentu. Saat layanan diminta dan tidak
terdaftar, hwservicemanager
meminta agar layanan
dimulai. Namun, HAL dinamis tidak memerlukan penggunaan salah satu dari hal ini.
Menentukan keluar HAL
Di Android 9, keluar HAL harus ditentukan secara manual. Untuk Android 10 dan yang lebih tinggi, hal ini juga dapat ditentukan dengan siklus proses otomatis.
Penonaktifan dinamis memerlukan beberapa kebijakan untuk menentukan kapan harus memulai
HAL dan kapan harus menonaktifkan HAL. Jika HAL memutuskan untuk keluar karena alasan apa pun, HAL
akan otomatis dimulai ulang saat 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 yang berbeda, termasuk:
- HAL dapat memilih untuk memanggil exit pada dirinya sendiri jika seseorang memanggil API tutup atau serupa di dalamnya. Perilaku ini harus ditentukan di antarmuka HAL yang sesuai.
- HAL dapat dinonaktifkan saat tugasnya selesai (didokumentasikan dalam file HAL).
Siklus proses otomatis
Android 10 menambahkan lebih banyak dukungan ke kernel dan
hwservicemanager
, yang memungkinkan HAL dinonaktifkan secara otomatis
setiap kali tidak memiliki klien. Untuk menggunakan fitur ini, lakukan semua langkah dalam
Perubahan pada definisi HAL serta:
- Daftarkan layanan di C++ dengan
LazyServiceRegistrar
, bukan fungsi anggota,registerAsService
, misalnya:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- Pastikan klien HAL menyimpan referensi ke HAL tingkat atas (antarmuka
yang terdaftar dengan
hwservicemanager
) hanya saat digunakan. Untuk menghindari penundaan jika referensi ini dihapus di thread hwbinder yang terus dieksekusi, klien juga harus memanggilIPCThreadState::self()->flushCommands()
setelah menghapus referensi untuk memastikan bahwa driver binder diberi tahu tentang perubahan jumlah referensi terkait.