HAL yang Tersedia Secara Dinamis

Android 9 mendukung penonaktifan dinamis subsistem perangkat keras Android saat tidak digunakan atau tidak diperlukan. Misalnya, saat pengguna tidak menggunakan Wi-Fi, subsistem Wi-Fi tidak boleh menggunakan memori, daya, atau sumber daya sistem lainnya. Di versi Android sebelumnya, HAL/driver tetap terbuka di perangkat Android selama ponsel Android di-boot.

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 memanggil IPCThreadState::self()->flushCommands() setelah menjatuhkan referensi untuk memastikan bahwa driver pengikat diberitahu tentang jumlah referensi terkait perubahan.