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