Google 致力于为黑人社区推动种族平等。查看具体举措

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

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

AOSP 包含多个辅助程序库,旨在帮助您实现 2.1 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。
  • health@2.1android.hardware.health@2.1 的缩写。指的是 Android 11 中发布的运行状况 HIDL 的 2.1 版 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 中的运行状况、关机模式充电和恢复模式

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

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

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 服务,请参阅实现 Health