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