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