HAL ของ ConfigStore

ใน Android 10 ConfigStore HAL จะใช้แฟล็กบิลด์เพื่อจัดเก็บค่าการกำหนดค่าในพาร์ติชัน vendor และบริการในพาร์ติชัน system จะเข้าถึงค่าเหล่านั้นโดยใช้ HIDL (ซึ่งเป็นจริงใน Android 9 ด้วย) อย่างไรก็ตาม ConfigStore HAL ถูกเลิกใช้งานแล้วเนื่องจากใช้หน่วยความจำสูงและใช้งานยาก

HAL ของ ConfigStore ยังคงอยู่ใน AOSP เพื่อรองรับพาร์ติชันของผู้ให้บริการเดิม ในอุปกรณ์ที่ใช้ Android 10 ขึ้นไป surfaceflinger จะอ่านพร็อพเพอร์ตี้ของระบบก่อน หากไม่มีการกำหนดพร็อพเพอร์ตี้ของระบบสำหรับรายการการกำหนดค่าใน SurfaceFlingerProperties.sysprop surfaceflinger จะกลับไปใช้ ConfigStore HAL

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

การออกแบบพื้นฐานนั้นเรียบง่าย โดยมีลักษณะดังนี้

การออกแบบ 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 ครั้งใหญ่เนื่องจากอินเทอร์เฟซที่แยกกันจะเข้ากันได้แบบย้อนหลังอีกต่อไป