實作動態關閉包括接起資料流程並執行 動態程序。
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 中指定此行為 存取 API
- HAL 可在工作完成後關閉 (如 HAL 中記錄所述) 檔案)。
自動生命週期
Android 10 為核心新增了更多支援
hwservicemanager
:允許 HAL 自動關閉
此外,他們也可以用來如要使用這項功能,請完成
HAL 定義異動
為:
- 使用
LazyServiceRegistrar
在 C++ 中註冊服務 而不是成員函式registerAsService
範例:// only one instance of LazyServiceRegistrar per process LazyServiceRegistrar registrar; registrar.registerAsService(myHidlService /* , "default" */);
- 驗證 HAL 用戶端是否保留頂層 HAL (即
介面註冊於
hwservicemanager
) 的 。避免此參照在 hwbinder 執行緒中遭捨棄時出現延遲 會繼續執行,用戶端也應呼叫IPCThreadState::self()->flushCommands()
在捨棄 以確保繫結器驅動程式得知 參考檔案數量異動。