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

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

ConfigStore HAL ได้รับการออกแบบมาให้เข้ากันได้กับการอัปเกรดเวอร์ชันรอง ซึ่งหมายความว่าเมื่อมีการแก้ไข 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 เมื่อเป็นไปได้