运行状况

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

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

要求

搭载 Android 9 的设备必须提供 2.0 HAL(而不得提供 1.0 HAL)。未搭载 Android 9 但计划将供应商映像更新为 Target Framework Compatibility Matrix 版本 3(Android 9 中发布的版本)的设备必须移除现有的 1.0 HAL 实现,并提供 2.0 HAL。

AOSP 包含多个帮助程序库,旨在帮助您实现 2.0 HAL 以及完成从旧版 1.0 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。
  • 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 中的运行状况、关机模式充电和恢复模式

HAL 接口

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/无线、电流、电压等)
  • 电池信息(状态、电池电量、电流、电压、充电、技术等)
  • 存储信息(存储设备信息、磁盘统计信息)

要详细了解如何实现运行状况服务,请参阅实现运行状况