يمكنك إعادة ضبط التعليمات البرمجية المشروطة لقراءة القيم ديناميكيًا من واجهة 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]
، كما هو موضّح
أدناه:
Type | الدالة (تم حذف معلَمات النموذج) |
---|---|
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
كلما أمكن ذلك.