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