Anda harus menggunakan HIDL untuk mendeskripsikan semua flag build yang digunakan untuk mengompilasi framework secara bersyarat. Flag build yang relevan harus dikelompokkan dan disertakan dalam satu file .hal. Penggunaan HIDL untuk menentukan item konfigurasi
mencakup manfaat berikut:
- Berversi (untuk menambahkan item konfigurasi baru, vendor/OEM harus memperluas HAL secara eksplisit)
- Terdokumentasi dengan baik
- Kontrol akses menggunakan SELinux
- Pemeriksaan dasar untuk item konfigurasi melalui Vendor Test Suite (pemeriksaan rentang, pemeriksaan saling ketergantungan antar-item, dll.)
- API yang dibuat otomatis di C++ dan Java
Mengidentifikasi flag build yang digunakan oleh framework
Mulailah dengan mengidentifikasi konfigurasi build yang digunakan untuk mengompilasi framework secara kondisional, lalu batalkan konfigurasi yang sudah tidak digunakan untuk memperkecil set. Misalnya,
kumpulan tanda build berikut diidentifikasi untuk surfaceflinger:
TARGET_USES_HWC2TARGET_BOARD_PLATFORMTARGET_DISABLE_TRIPLE_BUFFERINGTARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYSNUM_FRAMEBUFFER_SURFACE_BUFFERSTARGET_RUNNING_WITHOUT_SYNC_FRAMEWORKVSYNC_EVENT_PHASE_OFFSET_NSSF_VSYNC_EVENT_PHASE_OFFSET_NSPRESENT_TIME_OFFSET_FROM_VSYNC_NSMAX_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 di 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 file
.hal baru ke file Android.bp dan
Android.mk.
Menambahkan fungsi untuk tanda build
Untuk setiap tanda 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:
- Gunakan nama yang ringkas. Hindari mengonversi nama variabel makefile menjadi nama fungsi dan ingatlah bahwa awalan
TARGET_danBOARD_tidak lagi diperlukan. - Tambahkan komentar. Membantu developer memahami tujuan item konfigurasi, cara mengubah perilaku framework, nilai yang valid, dan informasi relevan lainnya.
Jenis nilai yang ditampilkan fungsi dapat berupa
Optional[Bool|String|Int32|UInt32|Int64|UInt64]. Jenis ditentukan
di types.hal dalam direktori yang sama dan membungkus nilai primitif dengan
kolom yang menunjukkan apakah nilai ditentukan oleh HAL; jika tidak, nilai
default akan digunakan.
struct OptionalString {
bool specified;
string value;
};
Jika sesuai, tentukan enum yang paling mewakili jenis item konfigurasi dan gunakan enum tersebut sebagai jenis yang ditampilkan. Dalam contoh di atas,
enum NumBuffers ditentukan untuk membatasi jumlah nilai
yang valid. Saat menentukan jenis data kustom tersebut, tambahkan kolom atau nilai enum (misalnya, USE_DEFAULT) untuk menunjukkan apakah nilai ditentukan/tidak ditentukan oleh HAL.
Satu tanda build tidak harus menjadi satu fungsi di HIDL. Pemilik modul juga dapat menggabungkan tanda build yang terkait erat ke dalam struct dan memiliki fungsi yang menampilkan struct tersebut (tindakan ini dapat mengurangi jumlah panggilan fungsi).
Misalnya, opsi untuk menggabungkan dua tanda build ke dalam satu struct
di 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 satu fungsi HAL
Sebagai alternatif untuk menggunakan satu fungsi HAL untuk semua tanda build, antarmuka HAL juga menyediakan fungsi sederhana seperti getBoolean(string
key) dan getInteger(string key). Pasangan
key=value yang sebenarnya disimpan dalam file terpisah dan layanan HAL
memberikan nilai dengan membaca/mengurai file tersebut.
Meskipun mudah ditentukan, pendekatan ini tidak mencakup manfaat yang diberikan oleh HIDL (penerapan versi, kemudahan dokumentasi, kontrol akses) dan oleh karena itu tidak direkomendasikan.
Antarmuka tunggal dan ganda
Desain antarmuka HAL untuk item konfigurasi memiliki dua pilihan:
- Satu antarmuka yang mencakup semua item konfigurasi
- Beberapa antarmuka, yang masing-masing mencakup serangkaian item konfigurasi terkait
Satu antarmuka lebih mudah, tetapi dapat menjadi tidak dapat dipertahankan saat lebih banyak item konfigurasi ditambahkan ke satu file. Selain itu, kontrol akses tidak terperinci, sehingga proses yang diberi 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 antarmuka HAL
untuk sekelompok item konfigurasi terkait. Misalnya,
ISurfaceflingerConfigs untuk item konfigurasi
terkait surfaceflinger, dan IBluetoothConfigs untuk item konfigurasi
terkait Bluetooth.