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