動態提供的 HAL

Android 9 支援動態關閉 Android 硬體的功能 建立子系統例如使用者 未使用 Wi-Fi,則 Wi-Fi 子系統不應佔用記憶體。 電源或其他系統資源在舊版 Android 中,HAL/驅動程式 在整個 Android 裝置上保持開啟的狀態 。

實作動態關閉包括接起資料流程並執行 動態程序。

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_startctl.interface_stopctl.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()在捨棄 以確保繫結器驅動程式得知 參考檔案數量異動。