HAL yang tersedia secara dinamis

Android 9 mendukung penonaktifan dinamis hardware Android subsistem saat mereka tidak digunakan atau tidak diperlukan. Misalnya, ketika pengguna tidak menggunakan Wi-Fi, subsistem Wi-Fi seharusnya tidak mengambil memori, daya, atau sumber daya sistem lainnya. Di versi Android sebelumnya, HAL/driver tetap terbuka di perangkat Android selama penggunaan Android ponsel di-{i>booting<i}.

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 memanggil IPCThreadState::self()->flushCommands() setelah menurunkan untuk memastikan bahwa driver binder diberi tahu tentang perubahan jumlah referensi.