Android 系統健康狀態

Android 9 內含 android.hardware.health HAL 2.0、 Health@1.0 HAL 的主要版本升級這個新的 HAL 具備以下功能: 優點:

  • 為架構和供應商程式碼提供更明確的區隔。
  • 淘汰不必要的 healthd Daemon。
  • 供應商自訂健康資訊的自由度較高 報表。
  • 不只是電池,裝置健康資訊也更豐富。

Android 11 包含 android.hardware.health HAL 2.1、 從 health@2.0 HAL 升級子版本這個新的 HAL 具備以下功能: 優點:

  • 導入簡單
  • 更符合現有 2.0 HAL API 的要求
  • 在偏離模式下的充電代碼中提供更強的 Treble 區隔功能
  • 更完善的架構支援,以指出電池的電池健康度 裝置

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。

Android 開放原始碼計畫包含多個輔助程式庫,旨在協助您實作 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 映像檔

Android 開放原始碼計畫包含多個輔助程式庫,旨在協助您實作 2.1 版 HAL 和舊版 1.0 HAL 的轉換作業。

搭載 Android 13 以上版本的裝置

搭載 Android 13 的裝置必須提供 AIDL HAL (且不得提供 HIDL HAL)。裝置無法搭載 Android 13,但計劃將供應商映像檔更新為 Target Framework Compatibility Matrix 第 7 版 (於 Android 13 推出) 必須移除現有的 HIDL HAL 實作項目,以及 可提供 AIDL HAL裝置未搭載 Android 13 且不打算更新供應商圖片 建議使用 AIDL HAL

裝置不得提供 HIDL 1.0 HAL。

Android 開放原始碼計畫包含多個輔助程式庫,旨在協助您導入 AIDL HAL 和舊 HIDL HAL 的轉換作業。

術語

  • health@1.0android.hardware.health@1.0 的縮寫。指的是 在 Android 8.0 中發布的 Health HIDL HAL 1.0 版。
  • health@2.0android.hardware.health@2.0 的縮寫。指的是 在 Android 9 中發布的 Health HIDL HAL 2.0 版。
  • health@2.1android.hardware.health@2.1 的縮寫。指的是 在 Android 11 中發布的 Health HIDL HAL 2.1 版。
  • health AIDL HALandroid.hardware.health 的縮寫。
    • 版本 1 已在 Android 13 中發布。
  • charger:以非模式充電的執行檔,顯示 手機充電動畫。
  • recovery:在復原模式下執行,且必須擷取電池的執行檔 可能不準確或不適當
  • healthd:在 Android 中執行的舊版 Daemon,可擷取健康相關 並提供給架構
  • storaged:在 Android 中執行的 Daemon,可以擷取儲存空間資訊 並提供給架構

Android 8.x 中的健康狀態

在 Android 8.x 中,健康元件的運作方式如下圖所示:

Android 8.x 中的健康狀態

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

下圖:

  • 架構會使用一 (1) 繫結器呼叫和一 (1) hwbinder 呼叫 與硬體通訊
  • healthd 的靜態連結連至 libhealthd_androidlibbatterymonitorlibbatteryservice
  • health@1.0-impl 靜態連結至 libhealthd.BOARD

每個主面板都可以自訂不同的 libhealthd.BOARD; 裝置在建構期間判定為搭載「Health@1.0-impl」和「修復」的連結 。

其他模式:

Android 8.x 中的關閉模式充電和復原模式

圖 2. Android 8.x 中的健康狀態,關閉模式充電和復原模式。

  • 充電器靜態連結至 libhealthd.BOARDlibhealthd_chargerlibbatterymonitor
  • 復原的靜態連結至 libhealthd.BOARD libbatterymonitor

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)      ] |
+-------------------------------------+

如果健康狀態 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 中導入了健康 AIDL HAL。 健康狀態元件的運作方式如下圖所示:

健康 AIDL HAL 基礎架構

圖 6. 健康 AIDL HAL 基礎架構。

HIDL HAL 介面 2.0

health@2.0 HAL 提供與舊版架構相同的功能 健康的 Daemon同時提供與健康狀態相似的 API 先前以繫結器服務的形式提供 (即 IBatteryPropertiesRegistrar)。

主要介面 健康 後,提供以下函式:

  • registerCallback,即將取代 IBatteryPropertiesRegistrar.registerListener
  • unregisterCallback,即將取代 IBatteryPropertiesRegistrar.unregisterListener
  • update,取代 IBatteryPropertiesRegistrar.scheduleUpdate
  • IBatteryPropertiesRegistrar.getProperties 取代為:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

此外,IHealth 會為 storaged 提供下列新的 API,以便 擷取供應商專屬的儲存空間相關資訊:

  • getStorageInfo
  • getDiskStats

系統會透過回呼和 getHealthInfo 傳回新的結構 @2.0::HealthInfo。 這個結構體包含透過 health@2.0 取得的所有裝置健康資訊 HAL,包括:

  • 充電資訊 (AC/USB/無線、電流、電壓等)
  • 電池資訊 (裝置狀態、電池電量、電流、電壓、充電 技術等)
  • 儲存空間資訊 (儲存裝置資訊、磁碟統計資料)

如要瞭解如何實作健康服務 2.0,請參閱 實作 Health 2.0

HIDL HAL 介面 2.1

health@2.1 HAL 支援離線充電功能,並提供更多資訊 電池相關資訊

主要介面 IHealth、 提供下列額外的函式

  • getHealthConfig:擷取這個 HAL 的設定
  • getHealthInfo_2_1:將子版本升級至 getHealthInfo
  • shouldKeepScreenOn:指定是否應持續顯示螢幕 充電模式

此外,您必須導入 @2.1::IHealth 才能支援。 針對其繼承的 registerCallback@2.1::IHealthInfoCallback unregisterCallback 函式。新的回呼介面會傳回健康狀態 透過 healthInfoChanged_2_1 函式 (而不是 沿用的 healthInfoChanged 函式

系統會透過回呼傳回新的結構 @2.1::HealthInfo,並 getHealthInfo_2_1。這個結構體內含額外的裝置健康資訊 可透過 health@2.0 HAL 取得,包括:

  • 電池容量等級
  • 電池充飽電後 (以秒為單位)
  • 電池充飽電設計容量 (以 μAh 為單位)

請參閱下列 UML 圖表,瞭解對健康 HAL 實作有幫助的類別:

健康狀態 2.1 HAL UML 圖表

圖 7. Health HAL 2.1 UML 圖表。

如要瞭解如何實作健康服務 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」和相關欄位已遭移除 未使用的。
  • chargerDockOnline 新增至 HealthInfo,以便支援座架充電。

實作

請參閱下列 UML 圖表,瞭解對健康 HAL 實作有幫助的類別:

健康 AIDL HAL UML 圖表

圖 8. 醫療照護 AIDL HAL UML 圖表。

如要瞭解如何導入 Health AIDL 服務,請參閱 實作 Health AIDL HAL

搶球

Android 13 支援復原繫結器。安裝 Health AIDL 服務復原功能,允許在復原模式中執行。

如要進一步瞭解如何安裝要復原的 Health AIDL 服務,請參閱 包括:

充電器

非模式充電功能已從「/system」移至「/vendor」。適用對象 搭載 Android 13 的裝置,必須支援 模式關閉,HAL 服務二進位檔必須支援充電器模式。方法如下 提及 實作充電器

充電器系統屬性

charger 二進位檔無法再讀取 ro.charger.* 的屬性 /vendor。如果裝置已設定任何 ro.charger.* 系統屬性, 提及 充電器系統屬性