安卓系統健康狀況

Android 9 包含android.hardware.health HAL 2.0,這是 health@1.0 HAL 的主要版本升級。這個新的 HAL 有以下優點:

  • 框架和供應商代碼之間更清晰的分離。
  • 棄用不必要的healthd守護程式。
  • 健康資訊報告中供應商客製化的自由度較大。
  • 不僅是電池,還有更多設備健康資訊。

Android 11 包含android.hardware.health HAL 2.1,這是 health@2.0 HAL 的次要版本升級。這個新的 HAL 有以下優點:

  • 更容易實施
  • 更符合現有 2.0 HAL API
  • 關閉模式充電代碼中更好的高音分離
  • 更好地支援框架來指示設備的電池健康狀況

Android 13 包含android.hardware.health AIDL HAL,它是從 health@2.1 HAL 的轉換。這個新的 HAL 有以下優點:

  • 刪除未使用的充電器相關API
  • 刪除未使用的StorageAttribute和相關字段
  • 支援底座充電。

要求

運行 Android 9 和 Android 10 的設備

使用 Android 9 啟動的裝置必須提供 2.x HAL(且不得提供 1.0 HAL)或 AIDL HAL。未隨 Android 9 一起啟動但計劃將供應商映像更新到目標框架相容性矩陣版本 3(在 Android 9 中發布)的裝置必須刪除現有的 1.0 HAL 實作並提供 2.x HAL 或 AIDL HAL。

AOSP 包含多個幫助程式庫,旨在協助您實現 2.0 HAL 以及從舊的 1.0 HAL 的過渡。

運行 Android 11 和 Android 12 的設備

使用 Android 11 啟動的裝置必須提供 2.1 HAL(且不得提供 1.0 或 2.0 HAL)或 AIDL HAL。未隨 Android 11 一起啟動但計劃將供應商映像更新至目標框架相容性矩陣版本 5(在 Android 11 中發布)的裝置必須刪除現有的 2.0 HAL 實作並提供 2.1 HAL 或 AIDL HAL。也建議未搭載 Android 11 且不打算更新供應商映像的裝置提供 2.1 HAL。

AOSP 包含多個幫助程式庫,旨在協助您實現 2.1 HAL 以及從舊的 1.0 HAL 的過渡。

運行 Android 13 及更高版本的設備

使用 Android 13 啟動的裝置必須提供 AIDL HAL(且不得提供 HIDL HAL)。未隨 Android 13 一起啟動但計劃將供應商映像更新到目標框架相容性矩陣版本 7(在 Android 13 中發布)的裝置必須刪除現有的 HIDL HAL 實作並提供 AIDL HAL。也建議未搭載 Android 13 且不打算更新供應商映像的裝置提供 AIDL HAL。

設備不得提供 HIDL 1.0 HAL。

AOSP 包含多個幫助程式庫,旨在協助您實現 AIDL HAL 以及從舊 HIDL HAL 的過渡。

術語

  • health@1.0android.hardware.health@1.0的縮寫。指 Android 8.0 中發布的健康 HIDL HAL 版本 1.0。
  • health@2.0android.hardware.health@2.0的縮寫。指 Android 9 中發布的健康 HIDL HAL 版本 2.0。
  • health@2.1android.hardware.health@2.1的縮寫。指 Android 11 中發布的健康 HIDL HAL 版本 2.1。
  • health AIDL HALandroid.hardware.health的縮寫。
    • 版本 1 在 Android 13 中發布。
  • Charger :在關閉充電模式下運行的可執行文件,顯示手機充電動畫。
  • recovery :在復原模式下執行的可執行文件,必須檢索電池資訊。
  • healthd :在 Android 中運行的遺留守護進程,用於檢索與健康相關的資訊並將其提供給框架。
  • storaged :在 Android 中運行的守護進程,用於檢索儲存資訊並將其提供給框架。

Android 8.x 中的健康狀況

在 Android 8.x 中,健康組件的工作原理如下圖所示:

Android 8.x 中的健康狀況

圖1 。 Android 8.x 中的健康狀況

在此圖中:

  • 框架使用一 (1) 個 Binder 呼叫和一 (1) 個 hwbinder 呼叫與硬體進行通訊。
  • healthd靜態連結到libhealthd_androidlibbatterymonitorlibbatteryservice
  • health@1.0-impl 靜態連結到libhealthd. BOARD

每個板可以定制不同的libhealthd. BOARD ;在建造時確定充電器、health@1.0-impl 和恢復連結到什麼。

對於其他模式:

Android 8.x 中的關閉模式充電與恢復模式

圖 2. Android 8.x 中的運作狀況、關閉模式充電和恢復模式

  • Charger 靜態連結到libhealthd. BOARDlibhealthd_chargerlibbatterymonitor
  • recovery 靜態連結到libhealthd. BOARDlibbatterymonitor

Android 9 中的健康狀況

在 Android 9 中,健康組件的工作原理如下圖所示: Android 9 中的健康狀況

圖3 . Android 9 中的健康狀況

該框架嘗試從hwservicemanager中檢索 health@2.0 服務。如果失敗,它會呼叫 health@1.0(在 Android 8.x 中)。保留舊程式碼路徑,以便 Android 9 系統映像與 Android 8.x 供應商映像相容。該框架不會從兩個 HAL 檢索訊息,因為設備上只能存在一個服務版本(1.0 或 2.0)。

對於其他模式:

Android 9 中的關閉模式充電與恢復

圖 4. Android 9 中的運作狀況、關閉模式充電和恢復模式

Android 11 中的健康狀況

在 Android 11 中,健康組件的工作原理如下圖所示:

[system]
    | getService()
    V
[health@2.1-service]
        | getService(stub=true)
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

如果 health 2.1 實作不存在,系統將回退到舊程式碼路徑,如前面部分所述

對於其他模式:

[       charger          ]
    | getService()      |  (legacy code path)
    V                   +-------------------------------------------------+
[health@2.1-service]                                                      |
        | getService(stub=true)                                           |
        V                                                                 |
[      health@2.0-impl-2.1-<device>.so      ]                             |
        |                                  | (device-dependent linkage)   |
        V                                  V                              |
+---------Helper libs for impl--------+   [libhealthd.device]             |
| [libhealthloop (uevent, wakealarm)] |                                   |
| [libhealth2impl (IHealth impl)    ] | <---------------------------------+
| [libbatterymonitor (battery)      ] |
+-------------------------------------+
[recovery]
        | getService() w/o hwservicemanager
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

不同模式請參考以下簡化圖:

健康 HAL 2.1 基礎設施

圖 5. Health HAL 2.1 基礎設施

Android 13 中的健康狀況

在 Android 13 中,引進了 health AIDL HAL。健康組件的工作原理如下圖所示:

健康 AIDL HAL 基礎設施

圖 6. Health AIDL HAL 基礎設施

HIDL HAL 介面 2.0

health@2.0 HAL 為框架提供了與舊的 healthd 守護程序相同的功能。它還提供類似於 healthd 先前作為綁定器服務提供的 API(即IBatteryPropertiesRegistrar )。

主介面IHealth提供以下功能:

  • registerCallback ,取代IBatteryPropertiesRegistrar.registerListener
  • unregisterCallback ,替換IBatteryPropertiesRegistrar.unregisterListener
  • update ,取代IBatteryPropertiesRegistrar.scheduleUpdate
  • IBatteryPropertiesRegistrar.getProperties替換為以下內容:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

此外, IHealthstoraged提供以下新 API 來檢索特定於供應商的儲存相關資訊:

  • getStorageInfo
  • getDiskStats

透過回調和getHealthInfo返回一個新結構@2.0::HealthInfo 。該結構包含透過 health@2.0 HAL 提供的所有設備健康信息,包括:

  • 充電資訊(AC/USB/無線、電流、電壓等)
  • 電池資訊(存在、電池電量、電流、電壓、電量、技術等)
  • 儲存資訊(儲存設備資訊、磁碟統計資訊)

有關實施 Health 服務 2.0 的信息,請參閱實施 Health 2.0

HIDL HAL 介面 2.1

health@2.1 HAL 支援關閉模式充電並提供更多有關電池的資訊。

主介面IHealth提供以下附加功能

  • getHealthConfig :檢索此 HAL 的配置
  • getHealthInfo_2_1getHealthInfo次要版本升級
  • shouldKeepScreenOn :確定螢幕是否應在充電模式下保持開啟狀態

此外, @2.1::IHealth的實作需要支援@2.1::IHealthInfoCallback繼承的registerCallbackunregisterCallback函數。新的回呼介面使用其healthInfoChanged_2_1函數而不是繼承的healthInfoChanged函數向客戶端傳回 health 健康資訊。

透過回調和getHealthInfo_2_1傳回一個新結構@2.1::HealthInfo 。該結構體包含可透過 health@2.0 HAL 取得的其他設備運作狀況信息,包括:

  • 電池容量水平
  • 電池充滿電所需時間(以秒為單位)
  • 電池滿載充電設計容量(單位μAh)

請參閱以下 UML 圖,以了解對健康 HAL 實作有用的類別:

健康2.1 HAL UML圖

圖 7. Health HAL 2.1 UML 圖

有關實施 Health 服務 2.1 的信息,請參閱實施 Health 2.1

AIDL HAL 介面版本 1

API變更

AIDL 版本 1 HAL 支援與 HIDL 2.1 HAL 類似的 API。與 HIDL 2.1 介面相比,API 中發生了以下變更:

  • HIDL HAL 2.1 中引入的充電器相關 API 未移植到 AIDL HAL。由於關閉模式充電的功能僅存在於/vendor分區上,因此供應商介面上的 API 不是必需的。若要正確實施關閉模式充電,請參閱下方的充電器
  • 類型StorageAttribute和相關欄位已被刪除,因為它們未使用。
  • HealthInfo中加入chargerDockOnline以支援底座充電。

執行

請參閱以下 UML 圖,以了解對健康 HAL 實作有用的類別:

Health AIDL HAL UML圖

圖 8. Health AIDL HAL UML 圖

有關實施 Health AIDL 服務的信息,請參閱實施 Health AIDL HAL

恢復

Android 13 支援恢復中的 Binder。將 Health AIDL 服務安裝到恢復允許其在恢復模式下運作。

有關將運行狀況 AIDL 服務安裝到恢復的信息,請參閱以下內容:

充電器

關閉模式充電的功能已從/system移至/vendor 。對於搭載 Android 13 的設備,如果支援關閉模式充電,則 HAL 服務二進位檔案必須支援充電器模式。為此,請參閱實作充電器

充電器系統特性

/vendor中的charger二進位檔案不再可讀屬性ro.charger.* 。如果您的裝置設定了任何ro.charger.*系統屬性,請參閱充電器的系統屬性