Mengimplementasikan penonaktifan dinamis melibatkan penyiapan aliran data dan mengeksekusi proses dinamis seperti yang dijelaskan di bagian berikut.
Perubahan pada definisi HAL
Penonaktifan dinamis memerlukan informasi tentang proses mana yang menjalankan HAL antarmuka (informasi ini mungkin juga berguna nanti dalam konteks lain) serta tidak memulai proses saat {i>booting<i} dan tidak memulainya ulang (hingga yang diminta lagi) saat mereka 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 memerlukan hwservicemanager
untuk memberi tahu
init
untuk memulai layanan yang diminta. Di Android 9,
init
menyertakan tiga pesan kontrol tambahan (mis.
ctl.start
): ctl.interface_start
,
ctl.interface_stop
, dan ctl.interface_restart
.
Pesan ini dapat digunakan sebagai sinyal init
untuk menaikkan dan menurunkan
antarmuka perangkat
keras tertentu. Saat layanan diminta dan tidak
terdaftar, hwservicemanager
meminta agar layanan
memulai. Namun, HAL dinamis tidak perlu menggunakan ketiganya.
Tentukan keluar HAL
Di Android 9, keluar HAL harus dilakukan secara manual ditentukan. Untuk Android 10 dan yang lebih tinggi, fitur ini juga dapat ditentukan dengan siklus proses otomatis.
Penonaktifan dinamis memerlukan beberapa kebijakan untuk memutuskan kapan harus memulai
HAL dan kapan harus mematikan HAL. Jika HAL memutuskan untuk
keluar karena alasan apa pun,
akan otomatis dimulai ulang saat diperlukan lagi menggunakan informasi
disediakan 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 {i>exit<i} sendiri jika seseorang menelepon API serupa di dalamnya. Perilaku ini harus ditetapkan dalam HAL yang sesuai dalam antarmuka berbasis web yang sederhana.
- HAL dapat dimatikan saat tugasnya selesai (didokumentasikan dalam HAL ).
Siklus proses otomatis
Android 10 menambahkan lebih
banyak dukungan ke {i>kernel<i} dan
hwservicemanager
, yang memungkinkan HAL dimatikan secara otomatis
ketika mereka tidak
memiliki klien. Untuk menggunakan fitur ini, lakukan semua langkah dalam
Perubahan pada definisi HAL juga
sebagai:
- Daftarkan layanan di C++ dengan
LazyServiceRegistrar
alih-alih fungsi anggota,registerAsService
, untuk contoh:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- Verifikasi bahwa klien HAL menyimpan referensi ke HAL level teratas (
antarmuka yang terdaftar di
hwservicemanager
) hanya jika sedang digunakan. Untuk menghindari penundaan jika referensi ini ditetapkan di thread hwbinder yang terus berjalan, klien juga harus memanggilIPCThreadState::self()->flushCommands()
setelah menurunkan untuk memastikan bahwa driver binder diberi tahu tentang perubahan jumlah referensi.