Android 系統健康狀態

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

  • 移除未使用的充電器相關 API
  • 移除未使用的 StorageAttribute 和相關欄位
  • 支援底座充電。

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

  • 架構和供應商程式碼之間的區隔更清楚。
  • 在健康資訊報告中,供應商可自由自訂的程度更高。
  • 除了電池外,還有更多裝置健康資訊。

本頁面提供實作 Health 2.1 HAL 的說明文件供您參考。

需求條件

本節包含 Android 11、12 和 13 以上版本的相關規定。

搭載 Android 11 和 Android 12 的裝置

搭載 Android 11 和 12 的裝置必須提供 2.1 HAL 或 AIDL HAL。如果裝置未搭載 Android 11 或 12,但打算將供應商映像檔更新至目標架構相容性矩陣第 5 版 (在 Android 11 中發布) 或第 6 版 (在 Android 12 中發布),則必須移除現有的 2.0 HAL 實作,並提供 2.1 HAL 或 AIDL HAL。如果裝置未搭載 Android 11,且不打算更新供應商映像檔,建議您提供 2.1 或 AIDL HAL。

AOSP 包含多個輔助程式庫,可協助您實作 2.1 HAL 並從舊版 HIDL 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。

AOSP 包含多個輔助程式庫,可協助您實作 AIDL HAL 和從舊版 HIDL HAL 進行轉換。

術語

在閱讀 Android 系統健康度說明文件的其餘部分之前,請先瞭解下列術語:

health@2.1
android.hardware.health@2.1 的縮寫。健康 HIDL 的 1.0 版已在 Android 11 中發布。
health AIDL HAL
android.hardware.health 的縮寫。健康 AIDL HAL 的 1 版已在 Android 13 中發布。
充電器
在關機充電模式下執行的執行檔,會顯示手機充電動畫。
recovery
在復原模式下執行的執行檔,必須擷取電池資訊。
storaged
Daemon,可擷取儲存空間資訊並提供給架構。

Android 11 和 12 中的健康

在 Android 11 和 12 中,健康狀態元件會按照下圖所示運作:

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

其他模式:

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

請參閱下列簡化的圖表,瞭解不同模式:

Health HIDL HAL 2.1 基礎架構

圖 1. Health HIDL HAL 2.1 基礎架構。

Android 13 中的健康

Android 13 中引入了健康 AIDL HAL。圖 2 詳細說明健康元件的運作方式:

Health AIDL HAL 基礎架構

圖 2. Health AIDL HAL 基礎架構。

HIDL HAL 介面 2.1

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

主要介面 IHealth 提供下列其他函式:

  • getHealthConfig:擷取此 HAL 的設定
  • getHealthInfo_2_1:升級至 getHealthInfo 的次要版本
  • shouldKeepScreenOn:判斷是否應在充電器模式下保持螢幕開啟

此外,@2.1::IHealth 的實作方式必須支援 @2.1::IHealthInfoCallback 的繼承 registerCallbackunregisterCallback 函式。新的回呼介面會使用其 healthInfoChanged_2_1 函式,而非繼承的 healthInfoChanged 函式,將健康狀態資訊傳回給用戶端。

使用回呼和 getHealthInfo_2_1 傳回新的結構體 @2.1::HealthInfo。這個結構體包含可透過 health@2.0 HAL 取得的其他裝置健康資訊,包括:

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

圖 3 顯示健康 HAL 實作所需的類別 UML 圖表:

Health 2.1 HAL UML 圖表

圖 3. Health HAL 2.1 UML 圖表。

如要瞭解如何實作 Health 2.1 服務,請參閱「實作 Health 2.1」。

AIDL HAL 介面第 1 版

本節提供 AIDL HAL 介面第 1 版的相關資訊。

API 變更

AIDL 1.0 HAL 支援與 HIDL 2.1 HAL 相似的 API。與 HIDL 2.1 介面相比,API 中的以下項目已變更:

  • 在 HIDL HAL 2.1 中引入的充電器相關 API 並未移植至 AIDL HAL。由於離線充電功能只會在 /vendor 分區中執行,因此供應商介面上的 API 並非必要。如要正確實作離線充電功能,請參閱充電器
  • 系統會移除未使用的 StorageAttribute 類型和相關欄位。
  • chargerDockOnline 已新增至 HealthInfo,以支援充電座充電功能。

實作

圖 4 顯示健康 AIDL HAL 實作所需的類別 UML 圖表:

Health AIDL HAL UML 圖表

圖 4. Health AIDL HAL UML 圖表。

如要瞭解如何實作健康 AIDL 服務,請參閱「實作 Health AIDL HAL」。

復原

Android 13 支援復原程序中的繫結器。將 Health AIDL 服務安裝至復原模式,即可在復原模式下執行。

如要瞭解如何安裝健康 AIDL 服務來進行復原,請參閱下列說明:

充電器

關機充電功能已從 /system 移至 /vendor。如果裝置支援關機充電,則 HAL 服務二進位檔必須支援充電器模式。如要這麼做,請參閱「實作充電器」一文。

充電器系統屬性

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