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