ใน 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
เดียวกัน หากควรมีนโยบาย SELinux ที่แตกต่างกันสำหรับ Flag การสร้างอย่างน้อย 1 รายการ
ต้องแยก Flag เหล่านั้นไปยังอินเทอร์เฟซอื่น ซึ่งอาจต้องมีการแก้ไขandroid.hardware.configstore package
ครั้งใหญ่เนื่องจากอินเทอร์เฟซที่แยกกันจะเข้ากันได้แบบย้อนหลังอีกต่อไป