Anda harus menggunakan HIDL untuk menjelaskan semua flag build yang digunakan untuk secara kondisional
mengompilasi kerangka kerja. Flag build yang relevan harus dikelompokkan dan disertakan dalam
file .hal
tunggal. Menggunakan HIDL untuk menentukan item konfigurasi
mencakup manfaat berikut:
- Berversi (untuk menambahkan item konfigurasi baru, vendor/OEM harus secara eksplisit memperluas HAL)
- Terdokumentasi dengan baik
- Kontrol akses menggunakan SELinux
- Pemeriksaan kesehatan untuk item konfigurasi melalui Pengujian Vendor Suite (pemeriksaan rentang, pemeriksaan inter-dependensi antar-item, dll.)
- API yang dibuat secara otomatis di C++ dan Java
Mengidentifikasi flag build yang digunakan oleh framework
Mulai dengan mengidentifikasi konfigurasi build yang digunakan untuk mengompilasi secara kondisional
, lalu tinggalkan konfigurasi yang sudah tidak digunakan untuk memperkecil set. Misalnya,
kumpulan tanda build berikut diidentifikasi untuk surfaceflinger
:
TARGET_USES_HWC2
TARGET_BOARD_PLATFORM
TARGET_DISABLE_TRIPLE_BUFFERING
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
NUM_FRAMEBUFFER_SURFACE_BUFFERS
TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK
VSYNC_EVENT_PHASE_OFFSET_NS
SF_VSYNC_EVENT_PHASE_OFFSET_NS
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
MAX_VIRTUAL_DISPLAY_DIMENSION
Membuat antarmuka HAL
Konfigurasi build untuk subsistem diakses
melalui antarmuka HAL, sementara
antarmuka untuk memberikan nilai konfigurasi
dikelompokkan dalam paket HAL
android.hardware.configstore
(saat ini menggunakan versi 1.0).
Misalnya, untuk membuat file antarmuka HAL untuk surfaceflinger
, di
hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal
:
package android.hardware.configstore@1.0; interface ISurfaceFlingerConfigs { // TO-BE-FILLED-BELOW };
Setelah membuat file .hal
, jalankan
hardware/interfaces/update-makefiles.sh
untuk menambahkan
.hal
ke Android.bp
dan
Android.mk
.
Menambahkan fungsi untuk tanda build
Untuk setiap flag build, tambahkan fungsi baru ke antarmuka. Misalnya, di
hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal
:
interface ISurfaceFlingerConfigs { disableTripleBuffering() generates(OptionalBool ret); forceHwcForVirtualDisplays() generates(OptionalBool ret); enum NumBuffers: uint8_t { USE_DEFAULT = 0, TWO = 2, THREE = 3, }; numFramebufferSurfaceBuffers() generates(NumBuffers ret); runWithoutSyncFramework() generates(OptionalBool ret); vsyncEventPhaseOffsetNs generates (OptionalUInt64 ret); presentTimeOffsetFromSyncNs generates (OptionalUInt64 ret); maxVirtualDisplayDimension() generates(OptionalInt32 ret); };
Saat menambahkan fungsi:
- Sampaikan nama dengan ringkas. Menghindari konversi variabel makefile
nama menjadi nama fungsi dan
perlu diingat bahwa
TARGET_
dan AwalanBOARD_
tidak lagi diperlukan. - Menambahkan komentar. Bantu developer memahami tujuan item konfigurasi, cara mengubah perilaku framework, nilai yang valid, dan tidak akurat atau tidak sesuai.
Jenis nilai yang ditampilkan fungsi dapat
Optional[Bool|String|Int32|UInt32|Int64|UInt64]
. Jenis ditentukan
di types.hal
pada direktori yang sama dan gabungkan nilai primitif dengan
isian yang menunjukkan apakah nilai
ditentukan oleh HAL; jika tidak, setelan default
nilai default yang digunakan.
struct OptionalString { bool specified; string value; };
Jika perlu, tentukan enum yang paling mewakili jenis
dan menggunakan enum tersebut sebagai jenis nilai yang ditampilkan. Pada contoh di atas,
enum NumBuffers
ditentukan untuk membatasi jumlah
masing-masing. Saat menentukan jenis data khusus tersebut, tambahkan bidang atau nilai enum (untuk
contoh, USE_DEFAULT
) untuk menunjukkan jika nilai tidak ditentukan
oleh HAL.
Tidak wajib flag build tunggal menjadi fungsi tunggal di HIDL. Pemilik modul juga dapat menggabungkan flag build yang terkait erat ke dalam sebuah struct dan memiliki fungsi yang mengembalikan struktur itu (melakukannya dapat mengurangi jumlah panggilan fungsi).
Misalnya, opsi untuk menggabungkan dua flag build ke dalam satu struct
dalam hardware/interfaces/configstore/1.0/ISurfaceFlingerConfigs.hal
adalah:
interface ISurfaceFlingerConfigs { // other functions here struct SyncConfigs { OptionalInt64 vsyncEventPhaseoffsetNs; OptionalInt64 presentTimeoffsetFromSyncNs; }; getSyncConfigs() generates (SyncConfigs ret); // other functions here };
Alternatif untuk fungsi HAL tunggal
Sebagai alternatif penggunaan fungsi HAL tunggal untuk semua penanda build, HAL
antarmuka ini juga menyediakan fungsi sederhana seperti getBoolean(string
key)
dan getInteger(string key)
. Sebenarnya
Pasangan key=value
disimpan dalam file terpisah dan layanan HAL
memberikan nilai dengan membaca/menguraikan file-file tersebut.
Meskipun pendekatan ini mudah didefinisikan, tetapi tidak menyertakan manfaatnya disediakan oleh HIDL (pembuatan versi yang ditegakkan, kemudahan dokumentasi, kontrol akses) dan oleh karena itu tidak direkomendasikan.
Satu dan beberapa antarmuka
Desain antarmuka HAL untuk item konfigurasi menyajikan dua pilihan:
- Satu antarmuka yang mencakup semua item konfigurasi
- Beberapa antarmuka, yang masing-masing mencakup sekumpulan konfigurasi terkait item
Satu antarmuka lebih mudah tetapi bisa menjadi tidak bisa dikelola karena lebih item konfigurasi ditambahkan ke satu file. Selain itu, kontrol akses tidak halus, jadi proses yang diberikan akses ke antarmuka dapat membaca semua item konfigurasi (akses ke sebagian item konfigurasi tidak dapat diberikan). Atau, jika akses tidak diberikan, item konfigurasi tidak dapat dibaca.
Karena masalah ini, Android menggunakan beberapa antarmuka dengan satu HAL
antarmuka untuk sekelompok item konfigurasi yang terkait. Misalnya,
ISurfaceflingerConfigs
untuk terkait surfaceflinger
item konfigurasi, dan IBluetoothConfigs
untuk
terkait Bluetooth
item konfigurasi.