คุณเปลี่ยนโครงสร้างโค้ดที่คอมไพล์แบบมีเงื่อนไขเพื่ออ่านค่าแบบไดนามิกจากอินเทอร์เฟซ 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
เพื่อรับแฮนเดิลสำหรับพร็อกซีของฟังก์ชันอินเทอร์เฟซ จากนั้นดึงข้อมูลค่าโดยการเรียกใช้แฮนเดิลผ่าน 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 ไม่ได้ระบุค่าสำหรับรายการการกําหนดค่า ฟังก์ชันแต่ละรายการใช้พารามิเตอร์เทมเพลต 2 รายการ ได้แก่
I
คือชื่อคลาสอินเทอร์เฟซFunc
คือตัวชี้ฟังก์ชันสมาชิกสำหรับการรับรายการการกําหนดค่า
เนื่องจากค่าการกําหนดค่าเป็นแบบอ่านอย่างเดียวและไม่มีการเปลี่ยนแปลง ฟังก์ชันยูทิลิตีจึงแคชค่าการกําหนดค่าไว้ภายใน การเรียกใช้ครั้งต่อๆ ไปจะมีประสิทธิภาพมากขึ้นโดยใช้ค่าที่แคชไว้ในหน่วยการลิงก์เดียวกัน
ใช้ configstore-utils
HAL ของ ConfigStore ออกแบบมาให้ใช้งานร่วมกันได้ในอนาคตสำหรับการอัปเกรดเวอร์ชันย่อย ซึ่งหมายความว่าเมื่อมีการแก้ไข 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
ทุกครั้งที่เป็นไปได้