Android 系统运行状况

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 但计划将供应商映像更新为 Target Framework Compatibility Matrix 版本 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 但计划将供应商映像更新为 Target Framework Compatibility Matrix 版本 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 中的运行状况组件

在 Android 11 和 12 中,运行状况组件的工作原理详情如下图所示:

[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)      ] |
+-------------------------------------+

下图简要展示了不同模式:

Health HIDL HAL 2.1 基础架构

图 1. Health HIDL HAL 2.1 基础架构。

Android 13 中的“运行状况”服务

Android 13 中引入了 Health AIDL HAL。图 2 详细介绍了运行状况组件的工作原理:

Health AIDL HAL 基础架构

图 2. Health AIDL HAL 基础架构。

HIDL HAL 接口 2.1

health@2.1 HAL 支持关机模式充电,并提供有关电池的更多信息。

主界面 IHealth 额外提供以下函数

  • getHealthConfig:用于检索此 HAL 的配置
  • getHealthInfo_2_1:将次要版本升级到 getHealthInfo
  • shouldKeepScreenOn:用于确定屏幕是否应在充电器模式下保持开启状态

此外,如需支持 @2.1::IHealthInfoCallback 的继承 registerCallbackunregisterCallback 函数,必须具有 @2.1::IHealth 的实现。新的回调接口使用其 healthInfoChanged_2_1 函数(而不是继承的 healthInfoChanged 函数)向客户端返回运行状况信息。

通过回调和 getHealthInfo_2_1 返回一个新结构 @2.1::HealthInfo。此结构包含可通过 health@2.0 HAL 访问的其他设备运行状况信息,包括:

  • 电池容量水平
  • 现在电池充满电所需的时间(以秒为单位)
  • 电池满电设计容量(以 μAh 为单位)

图 3 显示了可用于实现 Health HAL 的类的 UML 图:

Health 2.1 HAL UML 图

图 3. Health HAL 2.1 UML 图。

如需了解如何实现 Health 服务 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 分区,因此无需在供应商接口上使用 API。如需正确实现关机模式充电功能,请参阅充电器
  • 移除了 StorageAttribute 类型及相关字段,因为它们未使用。
  • HealthInfo 添加了 chargerDockOnline,以支持基座充电。

实现

图 4 显示了可用于实现 Health AIDL HAL 的类的 UML 图:

Health AIDL HAL UML 图

图 4. Health AIDL HAL UML 图。

如需了解如何实现 Health AIDL 服务,请参阅实现 Health AIDL HAL

恢复

Android 13 支持在恢复时使用 Binder。将 Health AIDL 服务安装到 recovery 分区后,该服务可在恢复模式 (Recovery mode) 下运行。

如需了解如何将 Health AIDL 服务安装到 recovery 分区,请参阅以下内容:

充电器

关机模式充电功能已从 /system 移至 /vendor。如果发布时搭载 Android 13 的设备支持关机模式充电,HAL 服务二进制文件必须支持充电器模式。为此,请参阅实现充电器

充电器系统属性

/vendor 中的 charger 二进制文件无法再读取 ro.charger.* 属性。如果您的设备设置了任何 ro.charger.* 系统属性,请参阅充电器的系统属性