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.0 :
android.hardware.health@1.0
的縮寫。指Android 8.0 發布的健康HIDL HAL 1.0 版。 - health@2.0 :
android.hardware.health@2.0
的縮寫。指 Android 9 發布的健康 HIDL HAL 2.0 版。 - health@2.1 :
android.hardware.health@2.1
的縮寫。指 Android 11 發布的健康 HIDL HAL 2.1 版。 - 健康 AIDL HAL :
android.hardware.health
的縮寫。- 版本 1 在 Android 13 中發布。
- 充電器:在關閉模式充電中運行的可執行文件,顯示手機充電動畫。
- recovery :在恢復模式下運行的可執行文件,必須檢索電池信息。
- healthd :在 Android 中運行的遺留守護程序,用於檢索與健康相關的信息並將其提供給框架。
- storaged :在 Android 中運行的守護進程,用於檢索存儲信息並將其提供給框架。
Android 8.x 中的健康狀況
在 Android 8.x 中,健康組件的工作原理如下圖所示:
圖 1 。 Android 8.x 中的健康狀況
在此圖中:
- 框架使用一 (1) 個 binder 調用和一 (1) 個 hwbinder 調用與硬件進行通信。
-
healthd
靜態鏈接到libhealthd_android
、libbatterymonitor
和libbatteryservice
。 - health@1.0-impl 靜態鏈接到
libhealthd. BOARD
。
每個板可以自定義不同的libhealthd. BOARD
;在構建時確定充電器、health@1.0-impl 和恢復鏈接到什麼。
對於其他模式:
圖 2. Android 8.x 中的健康狀況,關閉模式充電和恢復模式
- 充電器靜態鏈接到
libhealthd. BOARD
、libhealthd_charger
和libbatterymonitor
。 - 恢復靜態鏈接到
libhealthd. BOARD
和libbatterymonitor
。
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)。
對於其他模式:
圖 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. 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
-
此外, 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)
有關對健康 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
分區上,所以 Vendor Interface 上的 API 不是必需的。要正確實施關閉模式充電,請參閱下面的充電器。 - 類型
StorageAttribute
和相關字段被刪除,因為它們未使用。 -
chargerDockOnline
添加到HealthInfo
以支持底座充電。
執行
有關對健康 HAL 實現有用的類,請參見以下 UML 圖:
圖 8. Health AIDL HAL UML 圖
有關實施 Health AIDL 服務的信息,請參閱實施 Health AIDL HAL 。
恢復
Android 13 在恢復中支持活頁夾。將 Health AIDL 服務安裝到恢復允許它在恢復模式下運行。
有關安裝運行狀況 AIDL 服務以進行恢復的信息,請參閱以下內容:
充電器
關閉模式充電的功能從/system
移至/vendor
。對於搭載 Android 13 的設備,如果它們支持關閉模式充電,則 HAL 服務二進製文件必須支持充電器模式。為此,請參閱實施充電器。
充電器系統屬性
/vendor
中的charger
二進製文件不再讀取屬性ro.charger.*
。如果您的設備設置了任何ro.charger.*
系統屬性,請參閱充電器的系統屬性。