الاستخدام من جانب العميل

يمكنك إعادة بناء التعليمات البرمجية المترجمة بشكل مشروط لقراءة القيم ديناميكيًا من واجهة HAL. على سبيل المثال:

#ifdef TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS
// some code fragment
#endif

يمكن لكود إطار العمل بعد ذلك استدعاء وظيفة الأداة المساعدة المناسبة المحددة في <configstore/Utils.h> وفقًا لنوعها.

مثال على متجر التكوين

يوضح هذا المثال قراءة 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 حيثما أمكن ذلك.