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. Pada versi Android sebelumnya, HAL/driver tetap terbuka di perangkat Android selama ponsel Android di-boot.

Menerapkan pematian dinamis melibatkan pengkabelan aliran data dan menjalankan proses dinamis sebagaimana dirinci 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) ketika proses tersebut 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 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-pesan ini dapat digunakan sebagai sinyal init untuk menaikkan dan menurunkan antarmuka perangkat keras tertentu. Ketika layanan diminta dan tidak terdaftar, hwservicemanager meminta layanan tersebut dimulai. Namun, HAL dinamis tidak memerlukan penggunaan semua ini.

Tentukan pintu keluar HAL

Di Android 9, pintu 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 memulai HAL dan kapan mematikan HAL. Jika HAL memutuskan untuk keluar karena alasan apa pun, maka secara otomatis akan dimulai ulang ketika 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 berbeda, termasuk:

  • HAL dapat memilih untuk memanggil exit sendiri jika seseorang memanggil API yang mirip atau serupa di dalamnya. 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 pada kernel dan hwservicemanager , yang memungkinkan HAL dimatikan secara otomatis setiap kali mereka tidak memiliki klien. Untuk menggunakan fitur ini, lakukan semua langkah dalam Perubahan definisi HAL serta:

  • Daftarkan layanan dalam 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 hwservicemanager ) hanya saat sedang digunakan. Untuk menghindari penundaan jika referensi ini dihapus pada thread hwbinder yang terus dijalankan, klien juga harus memanggil IPCThreadState::self()->flushCommands() setelah menghapus referensi untuk memastikan bahwa driver binder diberitahu tentang jumlah referensi terkait perubahan.