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.*
系统属性,请参阅充电器的系统属性。