Android 8.0 membagi OS Android monolitik menjadi partisi generik ( system.img
) dan khusus perangkat keras ( vendor.img
dan odm.img
). Sebagai hasil dari perubahan ini, kompilasi bersyarat harus dihapus dari modul yang diinstal ke partisi sistem dan modul tersebut harus menentukan konfigurasi sistem saat runtime (dan berperilaku berbeda tergantung pada konfigurasi itu).
ConfigStore HAL menyediakan satu set API untuk mengakses item konfigurasi hanya-baca yang digunakan untuk mengonfigurasi framework Android. Halaman ini menjelaskan desain ConfigStore HAL (dan mengapa properti sistem tidak digunakan untuk tujuan ini); halaman lain di bagian ini merinci antarmuka HAL , implementasi layanan , dan penggunaan sisi klien , semua menggunakan surfaceflinger
sebagai contoh. Untuk bantuan dengan kelas antarmuka ConfigStore, lihat Menambahkan Kelas dan Item Antarmuka .
Mengapa tidak menggunakan properti sistem?
Kami mempertimbangkan untuk menggunakan properti sistem tetapi menemukan beberapa masalah mendasar, termasuk:
- Batas panjang pada nilai. Properti sistem memiliki batasan ketat pada panjang nilainya (92 byte). Selain itu, karena batasan ini telah terpapar langsung ke aplikasi Android sebagai makro C, menambah panjangnya dapat menyebabkan masalah kompatibilitas mundur.
- Tidak ada dukungan jenis. Semua nilai pada dasarnya adalah string, dan API hanya mengurai string menjadi
int
ataubool
. Tipe data gabungan lainnya (misalnya, array dan struct) harus dikodekan/didekode oleh klien (misalnya,"aaa,bbb,ccc"
dapat dikodekan sebagai array tiga string). - Menimpa. Karena properti sistem baca-saja diimplementasikan sebagai properti tulis-sekali, vendor/ODM yang ingin mengganti nilai baca-saja yang ditentukan AOSP harus mengimpor nilai baca-saja mereka sendiri sebelum nilai baca-saja yang ditentukan AOSP. Hal ini, pada gilirannya, menghasilkan nilai yang dapat ditulis ulang yang ditentukan oleh vendor ditimpa oleh nilai yang ditentukan oleh AOSP.
- Alamat kebutuhan ruang. Properti sistem membutuhkan ruang alamat yang relatif besar dalam setiap proses. Properti sistem dikelompokkan dalam unit
prop_area
dengan ukuran tetap 128 KB, yang semuanya dialokasikan ke ruang alamat proses meskipun hanya satu properti sistem di dalamnya yang sedang diakses. Ini dapat menyebabkan masalah pada perangkat 32-bit di mana ruang alamat sangat berharga.
Kami berusaha mengatasi keterbatasan ini tanpa mengorbankan kompatibilitas, tetapi tetap khawatir bahwa properti sistem tidak dirancang untuk mendukung pengaksesan item konfigurasi hanya-baca. Akhirnya kami memutuskan bahwa properti sistem lebih cocok untuk berbagi beberapa item yang diperbarui secara dinamis di seluruh Android secara real time, dan bahwa ada kebutuhan untuk sistem baru yang didedikasikan untuk mengakses item konfigurasi hanya-baca.
Desain HAL ConfigStore
Desain dasarnya sederhana:
Gambar 1. Desain ConfigStore HAL
- Jelaskan flag build (saat ini digunakan untuk mengompilasi kerangka kerja secara kondisional) di HIDL.
- Vendor dan OEM menyediakan SoC dan nilai khusus perangkat untuk flag build dengan mengimplementasikan layanan HAL.
- Ubah kerangka kerja untuk menggunakan layanan HAL guna menemukan nilai item konfigurasi saat runtime.
Item konfigurasi yang saat ini dirujuk oleh kerangka kerja disertakan dalam paket HIDL berversi ( android.hardware.configstore@1.0
). Vendor/OEM memberikan nilai ke item konfigurasi dengan mengimplementasikan antarmuka dalam paket ini, dan kerangka kerja menggunakan antarmuka saat perlu mendapatkan nilai untuk item konfigurasi.
Pertimbangan keamanan
Bendera build yang ditentukan dalam antarmuka yang sama dipengaruhi oleh kebijakan SELinux yang sama. Jika satu atau lebih flag build harus memiliki kebijakan SELinux yang berbeda, flag tersebut harus dipisahkan ke antarmuka lain . Ini dapat memerlukan revisi besar dari android.hardware.configstore package
karena antarmuka yang terpisah tidak lagi kompatibel ke belakang.