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,但計畫將供應商映像檔更新至 Target Framework 相容性矩陣第 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,但打算將供應商映像檔更新至 Target Framework Compatibility Matrix 5.0 版 (在 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 啟動,但打算將供應商映像檔更新為 Target Framework Compatibility Matrix 7 (在 Android 13 中發布),則必須移除現有的 HIDL HAL 實作,並提供 AIDL HAL。對於未使用 Android 13 啟動,且不打算更新供應商映像檔的裝置,我們也建議提供 AIDL HAL。
裝置不得提供 HIDL 1.0 HAL。
AOSP 包含多個輔助程式庫,可協助您實作 AIDL HAL,並從舊版 HIDL HAL 進行轉換。
術語
- health@1.0:
android.hardware.health@1.0
的縮寫。指的是 Android 8.0 中發布的 health HIDL HAL 1.0 版。 - health@2.0:
android.hardware.health@2.0
的縮寫。指的是 Android 9 中發布的 health HIDL HAL 2.0 版。 - health@2.1:
android.hardware.health@2.1
的縮寫。指的是 Android 11 發布的 health HIDL HAL 2.1 版。 - health AIDL HAL:
android.hardware.health
的縮寫。- 版本 1 已在 Android 13 中發布。
- charger:在非模式充電中執行,可顯示手機充電動畫。
- recovery:在復原模式下執行的執行檔,必須擷取電池資訊。
- healthd:在 Android 中執行的舊式 Daemon,可擷取健康相關資訊並提供給架構。
- storaged:在 Android 中執行的 Daemon,可擷取儲存空間資訊並提供給架構。
Android 8.x 中的健康狀態
在 Android 8.x 中,健康元件會按照下圖所示運作:
圖 1. Android 8.x 中的健康狀態。
在下圖中:
- 架構會使用一個 Binder 呼叫和一個 hwbinder 呼叫,與硬體通訊。
healthd
會靜態連結至libhealthd_android
、libbatterymonitor
和libbatteryservice
。- health@1.0-impl 會靜態連結至
libhealthd.BOARD
。
每個電路板都可以自訂不同的 libhealthd.BOARD
;系統會在建構期間決定要使用哪個充電器、health@1.0-impl 和復原連結。
其他模式:
圖 2. Android 8.x 中的 Health、關機充電和復原模式。
- charger 會將靜態連結至
libhealthd.BOARD
、libhealthd_charger
和libbatterymonitor
。 - recovery 會靜態連結至
libhealthd.BOARD
和libbatterymonitor
。
Android 9 中的健康
在 Android 9 中,健康元件的運作方式如下圖所示:
圖 3. Android 9 中的 Health
這個架構會嘗試從 hwservicemanager
擷取 health@2.0 服務。如果失敗,則會呼叫 health@1.0 (在 Android 8.x 中)。舊版程式碼路徑會保留,以便 Android 9 系統映像檔與 Android 8.x 供應商映像檔相容。架構不會從兩個 HAL 擷取資訊,因為裝置上只能存在一個服務版本 (1.0 或 2.0)。
其他模式:
圖 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) ] |
+-------------------------------------+
請參閱以下的簡化圖表瞭解不同模式:
圖 5. Health HAL 2.1 基礎架構。
Android 13 中的健康
在 Android 13 中,我們推出了健康 AIDL HAL。健康元件會按照下圖所示運作:
圖 6. 健康 AIDL HAL 基礎架構。
HIDL HAL 介面 2.0
health@2.0 HAL 為架構提供與舊健康狀態 Daemon 相同的功能。它也提供類似於 healthd 先前以繫結器服務形式提供的 API (即 IBatteryPropertiesRegistrar)。
主要介面 IHealth 提供下列函式:
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/無線、電流、電壓等)
- 電池資訊 (裝置狀態、電池電量、電流、電壓、充電、技術等)
- 儲存空間資訊 (儲存裝置資訊、磁碟統計資料)
如要瞭解如何實作 Health 2.0,請參閱「實作 Health 2.0」。
HIDL HAL 介面 2.1
health@2.1 HAL 支援離線充電模式,並提供更多電池相關資訊。
主要介面 IHealth 提供下列其他函式:
getHealthConfig
:擷取這個 HAL 的設定getHealthInfo_2_1
:升級至getHealthInfo
的次要版本shouldKeepScreenOn
:判斷是否應在充電器模式下保持螢幕開啟
此外,@2.1::IHealth
的實作方式必須支援 @2.1::IHealthInfoCallback
的繼承 registerCallback
和 unregisterCallback
函式。新的回呼介面會使用其 healthInfoChanged_2_1
函式,而非繼承的 healthInfoChanged
函式,將健康狀態資訊傳回給用戶端。
系統會透過回呼和 getHealthInfo_2_1
傳回新的結構體 @2.1::HealthInfo
。這個結構體包含可透過 health@2.0 HAL 取得的其他裝置健康資訊,包括:
- 電池容量等級
- 目前電池充電至滿電所需的時間 (以秒為單位)
- 電池充飽電設計容量 (以 μAh 為單位)
請參閱下列 UML 圖表,瞭解對健康 HAL 實作有用的類別:
圖 7. Health HAL 2.1 UML 圖表。
如要瞭解如何實作 Health 2.1 服務,請參閱「實作 Health 2.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 並非必要。如要正確實作離線充電功能,請參閱下方的charger。 - 系統會移除未使用的
StorageAttribute
類型和相關欄位。 chargerDockOnline
已新增至HealthInfo
,以支援充電座充電功能。
實作
請參閱下列 UML 圖表,瞭解對健康 HAL 實作有用的類別:
圖 8. Health AIDL HAL UML 圖表。
如要瞭解如何實作健康 AIDL 服務,請參閱「實作 Health AIDL HAL」。
復原
Android 13 支援復原程序中的繫結器。將 Health AIDL 服務安裝至復原模式,即可在復原模式下執行。
如要瞭解如何安裝健康 AIDL 服務以進行復原,請參閱以下內容:
充電器
關機充電功能已從 /system
移至 /vendor
。如果裝置支援關機充電,則 HAL 服務二進位檔必須支援充電器模式。如要這麼做,請參閱「實作充電器」一文。
充電器系統屬性
ro.charger.*
屬性不再可供 /vendor
中的 charger
二進位檔讀取。如果裝置已設定任何 ro.charger.*
系統屬性,請參閱充電器的系統屬性。