يمكنك إعادة تصميم الرمز البرمجي الذي يتم تجميعه بشكل مشروط لقراءة القيم ديناميكيًا من واجهة 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
تم تصميم ConfigStore HAL ليكون متوافقًا مع الإصدارات المستقبلية من خلال ترقيات الإصدارات الثانوية، ما يعني أنّه عند مراجعة 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
كلما أمكن ذلك.