الاستخدام من جهة العميل

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

لضمان التوافق مع الإصدارات المستقبلية، تأكَّد من أنّ عملية التنفيذ تلتزم بالإرشادات التالية:

  1. تستخدِم العناصر الجديدة القيمة التلقائية عندما تتوفّر فقط خدمة الإصدار القديم. مثال:
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. يستخدم العميل الواجهة الأولى التي تتضمّن عنصر ConfigStore. مثال:
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. يمكن استرداد خدمة الإصدار الجديد لواجهة الإصدار القديم. في المثال التالي، إذا كان الإصدار المثبَّت هو v1_1، يجب عرض خدمة v1_1 للسمة getService():
    V1_0::IConfig::getService()->v1_0API();
    

عند استخدام دوال الوصول في مكتبة configstore-utils للوصول إلى عنصر ConfigStore، يضمن التنفيذ الشرط رقم 1، بينما تضمن أخطاء المحول البرمجي الشرط رقم 2. لهذه الأسباب، ننصحك بشدة باستخدام configstore-utils كلما أمكن ذلك.