אפשר לארגן מחדש קוד שעבר הידור מותנה כדי לקרוא ערכים באופן דינמי מ: ממשק 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
.
לתאימות עתידית, יש לוודא שההטמעה שלך עומדת בדרישות של ההנחיות הבאות:
- פריטים חדשים משתמשים בערך ברירת המחדל רק עם השירות של הגרסה הישנה
זמין. דוגמה:
service = V1_1::IConfig::getService(); // null if V1_0 is installed value = DEFAULT_VALUE; if(service) { value = service->v1_1API(DEFAULT_VALUE); }
- הלקוח משתמש בממשק הראשון שכולל את הפריט ConfigStore.
דוגמה:
V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED V1_0::IConfig::getService()->v1_0API(); // OK
- ניתן לאחזר את השירות של הגרסה החדשה עבור הממשק של הגרסה הישנה. לחשבון
בדוגמה הבאה, אם הגרסה המותקנת היא v1_1, השירות v1_1
יוחזר בסכום של
getService()
:V1_0::IConfig::getService()->v1_0API();
כשפונקציות הגישה בספרייה configstore-utils
המשמש לגישה אל הפריט ConfigStore, מספר 1 מובטח על-ידי ההטמעה
ו-#2 מובטחת עקב שגיאות מהדר. מהסיבות האלה, אנחנו מאוד ממליצים
מומלץ להשתמש ב-configstore-utils
ככל האפשר.