Android 运行状况

Android 9 引入了从 health@1.0 HAL 升级的主要版本 android.hardware.health HAL 2.0。这一新 HAL 具有以下优势:

  • 框架代码和供应商代码之间的区别更清楚。
  • 废弃了不必要的 healthd 守护程序。
  • 供应商对运行状况信息报告进行自定义的自由度更高。
  • 更多设备运行状况信息(不仅包括电池信息)。

Android 11 包含 android.hardware.health HAL 2.1,这是一个从 health@2.0 HAL 升级的次要版本。这一新 HAL 具有以下优势:

  • 更易于实现
  • 更好地与现有 2.0 HAL API 保持一致
  • 在关机模式充电代码中可以实现更好的 Treble 分离
  • 更好地支持框架来指示设备的电池运行状况

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 但计划将供应商映像更新为 Target Framework Compatibility Matrix 版本 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 但计划将供应商映像更新为 Target Framework Compatibility Matrix 版本 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 但计划将供应商映像更新为 Target Framework Compatibility Matrix 版本 7(Android 13 中发布的版本)的设备必须移除现有的 HIDL HAL 实现,并提供 AIDL HAL。建议发布时未搭载 Android 13 且计划更新供应商映像的设备也提供 AIDL HAL。

此类设备不得提供 HIDL 1.0 HAL。

AOSP 包含多个辅助程序库,旨在帮助您实现 AIDL HAL 以及完成从旧版 HIDL HAL 的过渡。

术语

  • health@1.0android.hardware.health@1.0 的缩写。指的是 Android 8.0 中发布的运行状况 HIDL 的 1.0 版 HAL。
  • health@2.0android.hardware.health@2.0 的缩写。指的是 Android 9 中发布的运行状况 HIDL 的 2.0 版 HAL。
  • health@2.1android.hardware.health@2.1 的缩写。指的是 Android 11 中发布的 Health HIDL 的 2.1 版 HAL。
  • Health AIDL HALandroid.hardware.health 的缩写。
    • 版本 1 是在 Android 13 中发布的。
  • charger:在关机模式充电过程中运行的可执行文件,用于显示手机充电动画。
  • recovery:在恢复模式下运行的可执行文件,必须检索电池信息。
  • healthd:在 Android 中运行的旧版守护进程,用于检索与运行状况相关的信息并将其提供给框架。
  • storaged:在 Android 中运行的守护进程,用于检索存储信息并将其提供给框架。

Android 8.x 中的“运行状况”服务

在 Android 8.x 中,运行状况组件的工作原理详情如下图所示:

Android 8.x 中的“运行状况”服务

图 1. Android 8.x 中的“运行状况”服务

在此图中:

  • 框架通过一 (1) 次 Binder 调用和一 (1) 次 hwbinder 调用与硬件进行通信。
  • healthd 静态关联到 libhealthd_androidlibbatterymonitorlibbatteryservice
  • health@1.0-impl 静态关联到 libhealthd.BOARD

每个开发板都可以自定义不同的 libhealthd.BOARD;charger、health@1.0-impl 和 recovery 关联到哪个开发板是在构建时确定的。

对于其他模式:

Android 8.x 中的关机模式充电和恢复模式

图 2. Android 8.x 中的运行状况、关机模式充电和恢复模式

  • charger 静态关联到 libhealthd.BOARDlibhealthd_chargerlibbatterymonitor
  • recovery 静态关联到 libhealthd.BOARDlibbatterymonitor

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

在 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)。

对于其他模式:

Android 9 中的关机模式充电和恢复模式

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

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

Health HAL 2.1 基础架构

图 5. Health HAL 2.1 基础架构

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

Android 13 中引入了 Health AIDL HAL。运行状况组件的工作原理详情如下图所示:

Health AIDL HAL 基础架构

图 6. Health AIDL HAL 基础架构

HIDL HAL 接口 2.0

health@2.0 HAL 为框架提供了与旧版 healthd 守护程序相同的功能。此外,它还提供了与 healthd 以前作为 Binder 服务提供的 API 类似的 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 访问的所有设备运行状况信息,包括:

  • 充电信息(交流电/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::IHealthInfoCallback 的继承 registerCallbackunregisterCallback 函数,必须具有 @2.1::IHealth 的实现。新的回调接口使用其 healthInfoChanged_2_1 函数(而不是继承的 healthInfoChanged 函数)向客户端返回运行状况信息。

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

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

如需了解可用于实现 Health HAL 的类,请参阅下方 UML 图:

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

实现

如需了解可用于实现 Health HAL 的类,请参阅下方 UML 图:

Health AIDL HAL UML 图

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