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

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 มีข้อความควบคุมเพิ่มเติมสามข้อความ (เช่น ctl.start ): ctl.interface_start , ctl.interface_stop และ ctl.interface_restart ข้อความเหล่านี้สามารถใช้เพื่อส่งสัญญาณให้ init ต้นขึ้นและลงอินเทอร์เฟซฮาร์ดแวร์เฉพาะ เมื่อมีการร้องขอบริการและไม่ได้ลงทะเบียน hwservicemanager จะขอให้เริ่มบริการ อย่างไรก็ตาม HAL แบบไดนามิกไม่จำเป็นต้องใช้สิ่งเหล่านี้

กำหนดทางออก HAL

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

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

  • HAL สามารถเลือกที่จะเรียก exit ได้ด้วยตัวมันเอง ถ้ามีคนเรียก 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 ได้รับแจ้งเกี่ยวกับจำนวนการอ้างอิงที่เกี่ยวข้อง การเปลี่ยนแปลง