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

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