שימוש בצד הלקוח

אתה יכול לשנות קוד הידור מותנה כדי לקרוא ערכים באופן דינמי מממשק 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 כדי לקבל את הידית עבור ה-proxy של פונקציית הממשק, ואז מאחזרת את הערך על ידי הפעלת ה-handle דרך 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 בכל מקום אפשרי.