ใน Android 10 ConfigStore HAL จะใช้แฟล็กบิลด์เพื่อจัดเก็บค่าการกำหนดค่าในพาร์ติชัน vendor และบริการในพาร์ติชัน system จะเข้าถึงค่าเหล่านั้นโดยใช้ HIDL (ซึ่งเป็นจริงใน Android 9 ด้วย) อย่างไรก็ตาม ConfigStore HAL ถูกเลิกใช้งานแล้วเนื่องจากใช้หน่วยความจำสูงและใช้งานยาก
HAL ของ ConfigStore จะยังคงอยู่ใน AOSP เพื่อรองรับพาร์ติชันของผู้ให้บริการเดิม ในอุปกรณ์ที่ใช้ Android 10 ขึ้นไป surfaceflinger
จะอ่านพร็อพเพอร์ตี้ของระบบก่อน หากไม่มีการกำหนดพร็อพเพอร์ตี้ของระบบสำหรับรายการการกำหนดค่า
ใน `SurfaceFlingerProperties.sysprop` `surfaceflinger` จะกลับไปใช้ HAL ของ ConfigStore
Android 8.0 จะแยกระบบปฏิบัติการ Android แบบ Monolithic ออกเป็นพาร์ติชันทั่วไป
(system.img) และพาร์ติชันเฉพาะฮาร์ดแวร์ (vendor.img และ
odm.img) การเปลี่ยนแปลงนี้ส่งผลให้ต้องนำการคอมไพล์แบบมีเงื่อนไขออกจากโมดูลที่ติดตั้งในพาร์ติชันระบบ และโมดูลดังกล่าวต้องกำหนดค่าของระบบที่รันไทม์ (และทำงานแตกต่างกันไปตามการกำหนดค่านั้น)
ConfigStore HAL มีชุด API สำหรับเข้าถึงรายการการกำหนดค่าแบบอ่านอย่างเดียว
ที่ใช้ในการกำหนดค่าเฟรมเวิร์ก Android หน้านี้อธิบาย
การออกแบบ ConfigStore HAL (และเหตุผลที่ไม่ได้ใช้พร็อพเพอร์ตี้ของระบบเพื่อวัตถุประสงค์นี้)
หน้าอื่นๆ ในส่วนนี้จะอธิบายรายละเอียดเกี่ยวกับ
อินเทอร์เฟซ HAL
การติดตั้งใช้งานบริการ และ
การใช้งานฝั่งไคลเอ็นต์
โดยใช้ surfaceflinger เป็นตัวอย่าง หากต้องการความช่วยเหลือเกี่ยวกับคลาสอินเทอร์เฟซ ConfigStore โปรดดูการเพิ่มคลาสและรายการอินเทอร์เฟซ
ทำไมถึงไม่ใช้พร็อพเพอร์ตี้ของระบบ
เราพิจารณาที่จะใช้พร็อพเพอร์ตี้ของระบบ แต่พบปัญหาพื้นฐานหลายประการ ซึ่งรวมถึงปัญหาต่อไปนี้
- ขีดจำกัดความยาวของค่า พร็อพเพอร์ตี้ของระบบมี ขีดจํากัดที่เข้มงวดเกี่ยวกับความยาวของค่า (92 ไบต์) นอกจากนี้ เนื่องจาก ขีดจำกัดเหล่านี้แสดงต่อแอป Android โดยตรงเป็นมาโคร C การเพิ่ม ความยาวอาจทำให้เกิดปัญหาความเข้ากันได้แบบย้อนหลัง
- ไม่รองรับประเภท ค่าทั้งหมดเป็นสตริง และ
API จะแยกวิเคราะห์สตริงเป็น
intหรือboolไคลเอ็นต์ควรเข้ารหัส/ถอดรหัสประเภทข้อมูลแบบผสมอื่นๆ (เช่น อาร์เรย์และโครงสร้าง) (เช่น"aaa,bbb,ccc"สามารถเขียนโค้ดเป็นอาร์เรย์ของสตริง 3 รายการ) - การเขียนทับ เนื่องจากพร็อพเพอร์ตี้ของระบบแบบอ่านอย่างเดียวได้รับการ ติดตั้งใช้งานเป็นพร็อพเพอร์ตี้ที่เขียนได้ครั้งเดียว ผู้ให้บริการ/ODM ที่ต้องการลบล้างค่าแบบอ่านอย่างเดียวที่ กำหนดไว้ใน AOSP จะต้องนำเข้าค่าแบบอ่านอย่างเดียวของตนเองก่อน ค่าแบบอ่านอย่างเดียวที่กำหนดไว้ใน AOSP ซึ่งจะส่งผลให้ค่าที่เขียนซ้ำได้ซึ่งผู้ให้บริการกำหนด ถูกลบล้างด้วยค่าที่ AOSP กำหนด
- ข้อกำหนดเกี่ยวกับพื้นที่ที่อยู่ พร็อพเพอร์ตี้ของระบบใช้พื้นที่ที่อยู่ค่อนข้างมากในแต่ละกระบวนการ พร็อพเพอร์ตี้ของระบบจะ
จัดกลุ่มใน
prop_areaหน่วยที่มีขนาดคงที่ 128 KB ซึ่งทั้งหมด จะได้รับการจัดสรรให้กับพื้นที่ที่อยู่ของกระบวนการ แม้ว่าจะมีการเข้าถึงพร็อพเพอร์ตี้ของระบบเพียงรายการเดียวในนั้นก็ตาม ซึ่งอาจทำให้เกิดปัญหาในอุปกรณ์ 32 บิต ซึ่งมีพื้นที่ที่อยู่จำกัด
เราพยายามแก้ไขข้อจำกัดเหล่านี้โดยไม่ลดทอนความเข้ากันได้ แต่ยังคงกังวลว่าพร็อพเพอร์ตี้ของระบบไม่ได้ออกแบบมาเพื่อ รองรับการเข้าถึงรายการกำหนดค่าแบบอ่านอย่างเดียว ในที่สุดเราก็ตัดสินใจว่า พร็อพเพอร์ตี้ของระบบเหมาะกว่าสำหรับการแชร์รายการที่อัปเดตแบบไดนามิก ไม่กี่รายการใน Android ทั้งหมดแบบเรียลไทม์ และมีความจำเป็นต้องมีระบบใหม่ ที่ออกแบบมาเพื่อเข้าถึงรายการการกำหนดค่าแบบอ่านอย่างเดียว
การออกแบบ HAL ของ ConfigStore
การออกแบบพื้นฐานนั้นเรียบง่าย โดยมีลักษณะดังนี้

รูปที่ 1 การออกแบบ HAL ของ ConfigStore
- อธิบายฟีเจอร์บิลด์ (ปัจจุบันใช้สำหรับการคอมไพล์เฟรมเวิร์กแบบมีเงื่อนไข) ใน HIDL
- ผู้ให้บริการและ OEM จะระบุค่าเฉพาะของ SoC และอุปกรณ์สำหรับแฟล็กบิลด์โดย การใช้บริการ HAL
- แก้ไขเฟรมเวิร์กเพื่อใช้บริการ HAL เพื่อค้นหาค่าของ รายการการกำหนดค่าที่รันไทม์
รายการการกำหนดค่าที่เฟรมเวิร์กอ้างอิงอยู่ในขณะนี้จะรวมอยู่ใน
แพ็กเกจ HIDL ที่มีการควบคุมเวอร์ชัน (android.hardware.configstore@1.0)
ผู้ให้บริการ/OEM จะระบุค่าให้กับรายการการกำหนดค่าโดยการใช้
อินเทอร์เฟซในแพ็กเกจนี้ และเฟรมเวิร์กจะใช้อินเทอร์เฟซเมื่อต้องการ
รับค่าสำหรับรายการการกำหนดค่า
ข้อควรพิจารณาด้านความปลอดภัย
แฟล็กบิลด์ที่กำหนดไว้ในอินเทอร์เฟซเดียวกันจะได้รับผลกระทบจากนโยบาย SELinux
เดียวกัน หาก Flag การสร้างอย่างน้อย 1 รายการควรมีนโยบาย SELinux ที่แตกต่างกัน
จะต้องแยกไปยังอินเทอร์เฟซอื่น ซึ่งอาจต้องมีการแก้ไข android.hardware.configstore package ครั้งใหญ่เนื่องจากอินเทอร์เฟซที่แยกกันจะเข้ากันได้แบบย้อนหลังอีกต่อไป