Anda dapat memfaktorkan ulang kode yang dikompilasi secara bersyarat 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 di
<configstore/Utils.h>
, bergantung pada jenisnya.
Contoh ConfigStore
Contoh ini menunjukkan pembacaan
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
, yang ditentukan di ConfigStore HAL
sebagai forceHwcForVirtualDisplays()
dengan jenis nilai
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 handle bagi proxy
fungsi antarmuka, lalu mengambil nilai dengan memanggil handle 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 ini:
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 menggunakan dua
parameter template:
I
adalah nama class antarmuka.Func
adalah pointer fungsi anggota untuk mendapatkan item konfigurasi.
Karena nilai konfigurasi hanya baca dan tidak berubah, fungsi utilitas akan meng-cache nilai konfigurasi secara internal. Panggilan berikutnya akan dilayani secara lebih efisien menggunakan nilai yang di-cache di unit penautan yang sama.
Menggunakan configstore-utils
ConfigStore HAL dirancang agar kompatibel dengan versi baru untuk upgrade versi minor, yang berarti bahwa ketika 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 maju, pastikan penerapan 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 compiler. Karena alasan ini, sebaiknya
gunakan configstore-utils
jika memungkinkan.