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 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 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 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:
Jenis | Fungsi (parameter template tidak disertakan) |
---|---|
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 bersifat hanya baca dan tidak berubah, fungsi utilitas secara internal menyimpan nilai konfigurasi dalam cache. Panggilan berikutnya dilayani secara lebih efisien menggunakan nilai yang di-cache di unit penautan yang sama.
Menggunakan configstore-utils
HAL ConfigStore 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 maju, pastikan penerapan Anda mematuhi panduan berikut:
- Item baru menggunakan nilai default saat 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 penerapan dan #2 dijamin oleh error compiler. Karena alasan ini, sebaiknya gunakan configstore-utils
jika memungkinkan.