يمكنك إعادة ضبط التعليمات البرمجية المشروطة لقراءة القيم ديناميكيًا من واجهة HAL. مثلاً:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
يمكن بعد ذلك لرمز الإطار أن يستدعي دالة مساعدة مناسبة محدّدة في
<configstore/Utils.h>
استنادًا إلى نوعها.
مثال على ConfigStore
يعرض هذا المثال قراءة
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
، المحدّدة في ConfigStore HAL
على النحو forceHwcForVirtualDisplays()
مع نوع الإرجاع
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);
تتواصل دالة الأداة (getBool
في المثال أعلاه) مع خدمة
configstore
للحصول على معرّف الوكيل لدالة
الواجهة، ثم تسترجع القيمة من خلال استدعاء المعرّف عبر
HIDL/hwbinder.
وظائف المرافق
<configstore/Utils.h>
(configstore/1.0/include/configstore/Utils.h
) يوفّر وظائف
مساعدة لكل نوع ناتج أساسي، بما في ذلك
Optional[Bool|String|Int32|UInt32|Int64|UInt64]
، كما هو موضّح
أدناه:
النوع | الدالة (تم حذف مَعلمات النموذج) |
---|---|
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
هي قيمة تلقائية يتم عرضها عندما لا يحدّد تنفيذ HAL قيمة لعنصر الضبط. تأخذ كل دالة سمتَين
للنموذج:
I
هو اسم فئة الواجهة.Func
هو مؤشر دالة العضو للحصول على عنصر الإعداد.
ونظرًا لأن قيمة التهيئة للقراءة فقط ولا تتغير، تخزِّن دالة الأداة قيمة التهيئة مؤقتًا داخليًا. تتم معالجة المكالمات اللاحقة بكفاءة أكبر باستخدام القيمة المخزّنة مؤقتًا في وحدة الربط نفسها.
استخدام حزمة configstore-utils
تم تصميم HAL لـ ConfigStore ليكون متوافقًا مع الإصدارات الأحدث من أجل ترقيات الإصدارات الصغرى، ما يعني أنّه عند مراجعة HAL واستخدام بعض رموز إطار العمل
للعناصر التي تم تقديمها حديثًا، سيظل بإمكانك استخدام خدمة ConfigStore مع إصدار قديم
في /vendor
.
لضمان التوافق مع الإصدارات المستقبلية، تأكَّد من أنّ عملية التنفيذ تلتزم بالادّعاء التالي: الإرشادات:
- تستخدِم العناصر الجديدة القيمة التلقائية عندما تكون خدمة الإصدار القديم فقط متاحة. مثال:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- يستخدم العميل الواجهة الأولى التي تتضمّن عنصر ConfigStore.
مثال:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- يمكن استرداد خدمة الإصدار الجديد لواجهة الإصدار القديم. في المثال التالي، إذا كان الإصدار المثبّت هو v1_1، يجب عرض خدمة v1_1 لـ
getService()
:V1_0::IConfig::getService()->v1_0API();
عند استخدام وظائف الوصول في مكتبة configstore-utils
للوصول إلى عنصر ConfigStore، يتم ضمان الشرط 1 من خلال التنفيذ
ويتم ضمان الشرط 2 من خلال أخطاء المُجمِّع. لهذه الأسباب، ننصح بشدة
باستخدام configstore-utils
كلما أمكن.