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

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

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

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