Anda bisa 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 kerangka kerja kemudian dapat memanggil fungsi utilitas yang sesuai yang didefinisikan dalam
<configstore/Utils.h>
bergantung pada jenisnya.
Contoh ConfigStore
Contoh ini menunjukkan aktivitas membaca
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
, ditetapkan 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
pada contoh di atas) menghubungi
Layanan configstore
untuk mendapatkan handle bagi proxy
fungsi antarmuka pengguna, lalu mengambil nilai dengan memanggil {i>handle<i} melalui
HIDL/hwbinder.
Fungsi utilitas
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h
) menyediakan utilitas
fungsi 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 memerlukan 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, utilitas menyimpan cache nilai konfigurasi secara internal. Panggilan berikutnya akan dilayani secara lebih efisien menggunakan nilai yang di-cache dalam unit penautan yang sama.
Menggunakan configstore-utils
ConfigStore HAL dirancang agar kompatibel dengan versi baru untuk versi minor
upgrade, artinya ketika HAL direvisi dan beberapa kode kerangka kerja
menggunakan item yang baru diperkenalkan, yaitu layanan ConfigStore dengan anak di bawah umur
versi di /vendor
masih dapat digunakan.
Untuk kompatibilitas dengan versi baru, pastikan implementasi 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. Di beberapa
contoh berikut, jika versi yang terinstal adalah v1_1, layanan v1_1 harus
dikembalikan untuk
getService()
:V1_0::IConfig::getService()->v1_0API();
Saat fungsi akses di library configstore-utils
yang digunakan untuk mengakses item ConfigStore, #1 dijamin oleh implementasi
dan #2 dijamin oleh error compiler. Karena alasan ini, kami sangat
sebaiknya gunakan configstore-utils
jika memungkinkan.