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

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

פונקציות עזר

<configstore/Utils.h> (configstore/1.0/include/configstore/Utils.h) מספק תועלת לכל סוג חזרה פרימיטיבי, כולל Optional[Bool|String|Int32|UInt32|Int64|UInt64], כפי שמופיע ברשימה למטה:

סוג פונקציה (template parameters הושמטו)
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 וקוד framework מסוים משתמש בפריטים החדשים שנוספו, שירות 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 ככל האפשר.