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 但计划将供应商映像更新到目标框架兼容性矩阵版本 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
的缩写。health HIDL 的版本 1 在 Android 11 中发布。- health AIDL HAL
android.hardware.health
的缩写。health AIDL HAL 的版本 1 在 Android 13 中发布。- 充电器
- 在关机充电模式下运行的可执行文件,用于显示手机充电动画。
- 恢复
- 在恢复模式下运行的可执行文件,必须检索电池信息。
- storaged
- 检索存储信息并将其提供给框架的守护程序。
Android 11 和 12 中的 Health
在 Android 11 和 12 中,health 组件的工作方式如下图所示
[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) ] |
+-------------------------------------+
有关不同模式的简化图,请参见下图
图 1. Health HIDL HAL 2.1 基础架构。
Android 13 中的 Health
在 Android 13 中,引入了 health AIDL HAL。图 2 详细说明了 health 组件的工作方式
图 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
,以用于其继承的 registerCallback
和 unregisterCallback
函数。新的回调接口使用其 healthInfoChanged_2_1
函数而不是继承的 healthInfoChanged
函数向客户端返回运行状况信息。
新的结构体 @2.1::HealthInfo
通过回调和 getHealthInfo_2_1
返回。此结构体包含通过 health@2.0 HAL 提供的其他设备健康信息,包括:
- 电池容量级别
- 电池充满电所需时间(秒)
- 电池满电设计容量 (μAh)
图 3 显示了对 health HAL 实现有用的类的 UML 图
图 3. Health HAL 2.1 UML 图。
有关实现 Health service 2.1 的信息,请参阅实现 Health 2.1。
AIDL HAL 接口版本 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
以支持底座充电。
实现
图 4 显示了对 health AIDL HAL 实现有用的类的 UML 图
图 4. Health AIDL HAL UML 图。
有关实现 health AIDL 服务的信息,请参阅实现 Health AIDL HAL。
恢复
Android 13 支持恢复模式下的 Binder。将 Health AIDL 服务安装到恢复模式允许其在恢复模式下运行。
有关将 health AIDL 服务安装到恢复模式的信息,请参阅以下内容:
充电器
离线充电的功能已从 /system
移动到 /vendor
。对于使用 Android 13 发布的设备,如果它们支持离线充电,则 HAL 服务二进制文件必须支持充电器模式。为此,请参阅实现充电器。
充电器系统属性
属性 ro.charger.*
不再可由 /vendor
中的 charger
二进制文件读取。如果您的设备设置了任何 ro.charger.*
系统属性,请参阅充电器的系统属性。