يمكنك إعادة بناء التعليمات البرمجية المترجمة بشكل مشروط لقراءة القيم ديناميكيًا من واجهة HAL. على سبيل المثال:
#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS // some code fragment #endif
يمكن لكود إطار العمل بعد ذلك استدعاء وظيفة الأداة المساعدة المناسبة المحددة في <configstore/Utils.h>
وفقًا لنوعها.
مثال على متجر التكوين
يوضح هذا المثال قراءة 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
حيثما أمكن ذلك.