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

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

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

  • HAL อาจเลือกที่จะเรียก "ทางออก" ด้วยตัวเอง หากมีคนเรียกการปิดหรือ API ที่คล้ายกัน ต้องระบุลักษณะการทำงานนี้ใน HAL ที่เกี่ยวข้อง ของ Google
  • 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()หลังจากทิ้ง เอกสารอ้างอิงเพื่อให้แน่ใจว่าไดรเวอร์เอกสารทางธุรกิจได้รับแจ้งเกี่ยวกับ การเปลี่ยนแปลงจำนวนการอ้างอิง