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

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

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

  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 كلما أمكن.