實作動態關機功能時,需要連結資料流程並執行動態程序,詳情請參閱下文。
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
變更所提供的基礎架構。這可能涉及幾種不同的策略,包括:
- 如果有人在 HAL 上呼叫相似或相近的 API,HAL 可以選擇自行呼叫 exit。您必須在對應的 HAL 介面中指定這項行為。
- HAL 可在工作完成時關閉 (HAL 檔案中會記錄這項資訊)。
自動生命週期
Android 10 為核心和 hwservicemanager
提供更多支援,讓 HAL 在沒有用戶端時自動關閉。如要使用這項功能,請按照「HAL 定義變更」一文中的所有步驟操作,並完成以下步驟:
- 請使用
LazyServiceRegistrar
而非成員函式registerAsService
,在 C++ 中註冊服務,例如:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- 請確認 HAL 用戶端只在使用時保留頂層 HAL (使用
hwservicemanager
註冊的介面) 的參照。為避免在繼續執行的 hwbinder 執行緒上放棄此參照而造成延遲,用戶端應在放棄參照後呼叫IPCThreadState::self()->flushCommands()
,以確保繫結器驅動程式收到相關參照計數變更的通知。