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 9 的設備必須提供 2.0 HAL(並且不得提供 1.0 HAL)。未使用 Android 9 啟動但計劃將供應商映像更新到目標框架兼容性矩陣版本 3(在 Android 9 中發布)的設備必須刪除現有的 1.0 HAL 實現並提供 2.0 HAL。
搭載 Android 11 的設備必須提供 2.1 HAL(並且不得提供 1.0 或 2.0 HAL)。未隨 Android 11 啟動但計劃將供應商映像更新到 Target Framework Compatibility Matrix 版本 5(在 Android 11 中發布)的設備必須刪除現有的 2.0 HAL 實現並提供 2.1 HAL。還建議未使用 Android 11 啟動且不計劃更新供應商映像的設備提供 2.1 HAL。
AOSP 包含多個幫助程序庫,旨在幫助您實現 2.1 HAL 以及從舊的 1.0 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 版。 - 充電器:在關閉模式充電中運行的可執行文件,顯示手機充電動畫。
- 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) ] |
+-------------------------------------+
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/無線、電流、電壓等)
- 電池信息(存在、電池電量、電流、電壓、充電、技術等)
- 存儲信息(存儲設備信息、磁盤統計信息)
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)
有關實施 Health 服務的信息,請參閱實施 Health 。