คุณสามารถปรับโครงสร้างโค้ดที่คอมไพล์แบบมีเงื่อนไขเพื่ออ่านค่าแบบไดนามิกจาก อินเทอร์เฟซ 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 ทุกครั้งที่เป็นไปได้
