Anda dapat memfaktorkan ulang kode yang dikompilasi secara kondisional untuk membaca nilai secara dinamis dari antarmuka HAL. Contoh:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
Kode framework kemudian dapat memanggil fungsi utilitas yang sesuai yang ditentukan dalam
<configstore/Utils.h> bergantung pada jenisnya.
Contoh ConfigStore
Contoh ini menunjukkan pembacaan TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS, yang ditentukan dalam ConfigStore HAL sebagai forceHwcForVirtualDisplays() dengan jenis nilai yang ditampilkan OptionalBool:
#include <configstore/Utils.h>
using namespace android::hardware::configstore;
using namespace android::hardware::configstore::V1_0;
static bool vsyncPhaseOffsetNs = getBool<ISurfaceFlingerConfigs,
ISurfaceFlingerConfigs::forceHwcForVirtualDisplays>(false);
Fungsi utilitas (getBool dalam contoh di atas) menghubungi layanan configstore untuk mendapatkan pengendali untuk proxy fungsi antarmuka, lalu mengambil nilai dengan memanggil pengendali melalui HIDL/hwbinder.
Fungsi utilitas
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h) menyediakan fungsi utilitas untuk setiap jenis nilai yang ditampilkan primitif, termasuk
Optional[Bool|String|Int32|UInt32|Int64|UInt64], seperti yang tercantum
di bawah:
| Jenis | Fungsi (parameter template dihilangkan) |
|---|---|
OptionalBool |
bool getBool(const bool defValue) |
OptionalInt32 |
int32_t getInt32(const int32_t defValue) |
OptionalUInt32 |
uint32_t getUInt32(const uint32_t defValue) |
OptionalInt64 |
int64_t getInt64(const int64_t defValue) |
OptionalUInt64 |
uint64_t getUInt64(const uint64_t defValue) |
OptionalString |
std::string getString(const std::string &defValue) |
defValue adalah nilai default yang ditampilkan saat implementasi HAL tidak menentukan nilai untuk item konfigurasi. Setiap fungsi mengambil dua parameter template:
Iadalah nama class antarmuka.Funcadalah pointer fungsi anggota untuk mendapatkan item konfigurasi.
Karena nilai konfigurasi bersifat hanya baca dan tidak berubah, fungsi utilitas secara internal menyimpan nilai konfigurasi dalam cache. Panggilan berikutnya dilayani dengan lebih efisien menggunakan nilai yang di-cache di unit penautan yang sama.
Menggunakan configstore-utils
ConfigStore HAL dirancang agar kompatibel ke depan untuk upgrade versi minor, yang berarti bahwa saat HAL direvisi dan beberapa kode framework menggunakan item yang baru diperkenalkan, layanan ConfigStore dengan versi minor yang lebih lama di /vendor masih dapat digunakan.
Untuk kompatibilitas ke depan, pastikan implementasi Anda mematuhi panduan berikut:
- Item baru menggunakan nilai default jika hanya layanan versi lama yang tersedia. Contoh:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); } - Klien menggunakan antarmuka pertama yang menyertakan item ConfigStore.
Contoh:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- Layanan versi baru dapat diambil untuk antarmuka versi lama. Dalam contoh berikut, jika versi yang diinstal adalah v1_1, layanan v1_1 harus ditampilkan untuk
getService():V1_0::IConfig::getService()->v1_0API();
Saat fungsi akses di library configstore-utils digunakan untuk mengakses item ConfigStore, #1 dijamin oleh implementasi dan #2 dijamin oleh error kompilator. Karena alasan ini, sebaiknya gunakan configstore-utils jika memungkinkan.