يمكنك إعادة هيكلة الرمز البرمجي الذي يتم تجميعه بشكل مشروط لقراءة القيم ديناميكيًا من واجهة طبقة تجريد الأجهزة (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 حيثما أمكن ذلك.