HAL ที่พร้อมใช้งานแบบไดนามิก

Android 9 รองรับการปิดระบบย่อยของฮาร์ดแวร์ Android แบบไดนามิกเมื่อไม่ได้ใช้งานหรือไม่จำเป็นต้องใช้งาน เช่น เมื่อผู้ใช้ไม่ได้ใช้ Wi-Fi ระบบย่อยของ Wi-Fi ไม่ควรใช้หน่วยความจำ พลังงาน หรือทรัพยากรระบบอื่นๆ ใน Android เวอร์ชันก่อนหน้า HAL/ไดรเวอร์จะเปิดอยู่ในอุปกรณ์ Android ตลอดระยะเวลาที่โทรศัพท์ Android บูต

การใช้การปิดระบบแบบไดนามิกเกี่ยวข้องกับการเดินสายข้อมูลและการดำเนินการกระบวนการแบบไดนามิกตามที่อธิบายไว้ในส่วนต่อไปนี้

การเปลี่ยนแปลงคำจำกัดความ HAL

การปิดระบบแบบไดนามิกต้องใช้ข้อมูลเกี่ยวกับกระบวนการที่ให้บริการอินเทอร์เฟซ HAL ใด (ข้อมูลนี้อาจมีประโยชน์ในบริบทอื่นๆ ในภายหลังด้วย) รวมถึงไม่เริ่มกระบวนการในการบูตและไม่เริ่มกระบวนการอีกครั้ง (จนกว่าจะขออีกครั้ง) เมื่อกระบวนการออก

# some init.rc script associated with the HAL
service vendor.some-service-name /vendor/bin/hw/some-binary-service
    # init language extension, provides information of what service is served
    # if multiple interfaces are served, they can be specified one on each line
    interface android.hardware.light@2.0::ILight default
    # restarted if hwservicemanager dies
    # would also cause the hal to start early during boot if disabled wasn't set
    class hal
    # will not be restarted if it exits until it is requested to be restarted
    oneshot
    # will only be started when requested
    disabled
    # ... other properties

การเปลี่ยนแปลงใน init และ hwservicemanager

การปิดระบบแบบไดนามิกยังกำหนดให้ hwservicemanager ต้องบอก init ให้เริ่มบริการที่ขอ ใน Android 9 init มีข้อความควบคุมเพิ่มเติม 3 รายการ (เช่น ctl.start) ได้แก่ ctl.interface_start, ctl.interface_stop และ ctl.interface_restart ข้อความเหล่านี้สามารถใช้เป็นสัญญาณให้ init เปิดและปิดอินเทอร์เฟซฮาร์ดแวร์บางอย่าง เมื่อมีการขอบริการและยังไม่ได้ลงทะเบียน hwservicemanager จะขอให้เริ่มบริการ แต่ HAL แบบไดนามิกไม่จำเป็นต้องใช้สิ่งเหล่านี้

กำหนด HAL Exit

ใน Android 9 คุณต้องกำหนดการออกของ HAL ด้วยตนเอง สําหรับ Android 10 ขึ้นไป คุณสามารถกําหนดได้ด้วยวงจรอัตโนมัติ

การปิดระบบแบบไดนามิกต้องใช้นโยบายหลายรายการในการเลือกเวลาเริ่มต้น HAL และเวลาปิด HAL หาก HAL ตัดสินใจที่จะออกด้วยเหตุผลใดก็ตาม ระบบจะรีสตาร์ท HAL โดยอัตโนมัติเมื่อจําเป็นต้องใช้อีกครั้งโดยใช้ข้อมูลที่ระบุไว้ในคําจํากัดความ HAL และโครงสร้างพื้นฐานที่ได้จากการเปลี่ยนแปลง init และ hwservicemanager ซึ่งอาจใช้กลยุทธ์ต่างๆ 2-3 อย่าง ได้แก่

  • HAL อาจเลือกเรียก exit กับตัวเองได้หากมีผู้เรียก API ที่คล้ายกันหรือเรียก API "ปิด" คุณต้องระบุลักษณะการทํางานนี้ในอินเทอร์เฟซ HAL ที่เกี่ยวข้อง
  • HAL สามารถปิดเครื่องได้เมื่องานเสร็จสมบูรณ์ (บันทึกไว้ในไฟล์ HAL)

วงจรอัตโนมัติ

Android 10 เพิ่มการรองรับเคอร์เนลและ hwservicemanager มากขึ้น ซึ่งช่วยให้ HAL ปิดโดยอัตโนมัติได้เมื่อไม่มีไคลเอ็นต์ หากต้องการใช้ฟีเจอร์นี้ ให้ทำตามขั้นตอนทั้งหมดในการเปลี่ยนแปลงคำจำกัดความ HAL รวมถึงทำตามขั้นตอนต่อไปนี้

  • ลงทะเบียนบริการใน C++ ด้วย LazyServiceRegistrarแทนฟังก์ชันสมาชิก registerAsService ตัวอย่างเช่น
    // only one instance of LazyServiceRegistrar per process
    LazyServiceRegistrar registrar;
    registrar.registerAsService(myHidlService /* , "default" */);
  • ยืนยันว่าไคลเอ็นต์ HAL จะเก็บการอ้างอิงไปยัง HAL ระดับบนสุด (อินเทอร์เฟซที่ลงทะเบียนกับ hwservicemanager) ไว้เฉพาะเมื่อใช้งานเท่านั้น เพื่อหลีกเลี่ยงความล่าช้าหากมีการทิ้งข้อมูลอ้างอิงนี้ในเธรด hwbinder ที่ยังคงทำงานอยู่ ไคลเอ็นต์ควรเรียกใช้ IPCThreadState::self()->flushCommands() ด้วยหลังจากทิ้งข้อมูลอ้างอิงเพื่อให้มั่นใจว่าไดรเวอร์ Binder จะได้รับแจ้งเกี่ยวกับการเปลี่ยนแปลงจำนวนข้อมูลอ้างอิงที่เกี่ยวข้อง