HAL yang tersedia secara dinamis

Android 9 mendukung penonaktifan dinamis subsistem hardware Android saat tidak digunakan atau tidak diperlukan. Misalnya, saat pengguna tidak menggunakan Wi-Fi, subsistem Wi-Fi tidak boleh menggunakan memori, daya, atau resource sistem lainnya. Pada versi Android sebelumnya, HAL/driver tetap terbuka di perangkat Android selama durasi ponsel Android di-booting.

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