การใช้งานฝั่งไคลเอ็นต์

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

สำหรับความเข้ากันได้กับการส่งต่อ ให้ตรวจสอบว่าการใช้งานเป็นไปตาม หลักเกณฑ์ต่อไปนี้

  1. รายการใหม่จะใช้ค่าเริ่มต้นเมื่อมีเฉพาะบริการของเวอร์ชันเก่า พร้อมใช้งาน ตัวอย่าง
    service = V1_1::IConfig::getService(); // null if V1_0 is installed
    value = DEFAULT_VALUE;
      if(service) {
        value = service->v1_1API(DEFAULT_VALUE);
      }
    
  2. ไคลเอ็นต์ใช้อินเทอร์เฟซแรกที่มีรายการ ConfigStore ตัวอย่าง
    V1_1::IConfig::getService()->v1_0API(); // NOT ALLOWED
    
    V1_0::IConfig::getService()->v1_0API(); // OK
    
  3. สามารถเรียกข้อมูลบริการของเวอร์ชันใหม่สำหรับอินเทอร์เฟซของเวอร์ชันเก่าได้ ใน ตัวอย่างต่อไปนี้ ถ้าเวอร์ชันที่ติดตั้งอยู่คือ v1_1 บริการ v1_1 ต้อง ส่งคืนสำหรับ getService(): วันที่
    V1_0::IConfig::getService()->v1_0API();
    

เมื่อฟังก์ชันการเข้าถึงในคลัง configstore-utils เปิดอยู่ ซึ่งใช้ในการเข้าถึงรายการ ConfigStore จะมีการรับประกันอันดับ 1 จากการใช้งาน และข้อ 2 เกิดจากข้อผิดพลาดของคอมไพเลอร์ ด้วยเหตุผลเหล่านี้ เราจึงขอแนะนำอย่างยิ่ง แนะนำให้ใช้ configstore-utils ทุกครั้งที่ทำได้