安卓健康

Android 9 包括android.hardware.health HAL 2.0,它是 health@1.0 HAL 的主要版本升级。这种新的 HAL 具有以下优点:

  • 框架和供应商代码之间的分离更清晰。
  • 弃用不必要的healthd守护程序。
  • 健康信息报告中供应商定制的更大自由度。
  • 比电池更多的设备健康信息。

Android 11 包括android.hardware.health HAL 2.1,它是 health@2.0 HAL 的次要版本升级。这种新的 HAL 具有以下优点:

  • 更容易实施
  • 更好地符合现有的 2.0 HAL API
  • 关闭模式充电代码中更好的高音分离
  • 更好地支持框架以指示设备的电池健康状况

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 启动但计划将供应商映像更新到目标框架兼容性矩阵版本 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 启动但计划将供应商映像更新到目标框架兼容性矩阵版本 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 但计划将供应商映像更新到目标框架兼容性矩阵版本 7(在 Android 13 中发布)的设备必须删除现有的 HIDL HAL 实现并提供 AIDL HAL。还建议未使用 Android 13 启动且不计划更新供应商映像的设备提供 AIDL HAL。

设备不得提供 HIDL 1.0 HAL。

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

术语

  • health@1.0 : android.hardware.health@1.0的缩写。指Android 8.0 发布的健康HIDL HAL 1.0 版。
  • health@2.0 : android.hardware.health@2.0的缩写。指 Android 9 发布的健康 HIDL HAL 2.0 版。
  • health@2.1 : android.hardware.health@2.1的缩写。指 Android 11 发布的健康 HIDL HAL 2.1 版。
  • 健康 AIDL HALandroid.hardware.health的缩写。
    • 版本 1 在 Android 13 中发布。
  • 充电器:在关闭模式充电中运行的可执行文件,显示手机充电动画。
  • 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 ;在构建时确定充电器、health@1.0-impl 和恢复链接到什么。

对于其他模式:

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

图 2. Android 8.x 中的健康状况,关闭模式充电和恢复模式

  • 充电器静态链接到libhealthd. BOARDlibhealthd_chargerlibbatterymonitor
  • 恢复静态链接到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.1 基础设施

图 5. Health HAL 2.1 基础架构

Android 13 中的健康

在 Android 13 中,引入了健康 AIDL HAL。健康组件的工作原理如下图所示:

健康 AIDL HAL 基础设施

图 6. Health AIDL HAL 基础设施

HIDL HAL 接口 2.0

health@2.0 HAL 为框架提供与旧的 healthd 守护程序相同的功能。它还提供类似于 healthd 以前作为绑定服务提供的 API(即IBatteryPropertiesRegistrar )。

主界面IHealth提供以下功能:

  • registerCallback ,替换IBatteryPropertiesRegistrar.registerListener
  • unregisterCallback ,替换IBatteryPropertiesRegistrar.unregisterListener
  • update ,替换IBatteryPropertiesRegistrar.scheduleUpdate
  • IBatteryPropertiesRegistrar.getProperties替换为以下内容:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

此外, IHealthstoraged提供了以下新 API,以检索供应商特定的存储相关信息:

  • getStorageInfo
  • getDiskStats

通过回调和getHealthInfo返回一个新结构@2.0::HealthInfo 。此结构包含通过 health@2.0 HAL 可用的所有设备健康信息,包括:

  • 充电信息(AC/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::IHealth的实现需要支持@2.1::IHealthInfoCallback继承的registerCallbackunregisterCallback函数。新的回调接口使用其healthInfoChanged_2_1函数而不是继承的healthInfoChanged函数向客户端返回健康健康信息。

通过回调和getHealthInfo_2_1返回一个新结构@2.1::HealthInfo 。此结构包含可通过 health@2.0 HAL 获得的其他设备健康信息,包括:

  • 电池容量等级
  • 电池充电时间到现在(以秒为单位)
  • 电池满充设计容量(单位:μAh)

有关对健康 HAL 实现有用的类,请参见以下 UML 图:

健康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分区上,所以 Vendor Interface 上的 API 不是必需的。要正确实施关闭模式充电,请参阅下面的充电器
  • 类型StorageAttribute和相关字段被删除,因为它们未使用。
  • chargerDockOnline添加到HealthInfo以支持底座充电。

执行

有关对健康 HAL 实现有用的类,请参见以下 UML 图:

健康 AIDL HAL UML 图

图 8. Health AIDL HAL UML 图

有关实施 Health AIDL 服务的信息,请参阅实施 Health AIDL HAL

恢复

Android 13 在恢复中支持活页夹。将 Health AIDL 服务安装到恢复允许它在恢复模式下运行。

有关安装运行状况 AIDL 服务以进行恢复的信息,请参阅以下内容:

充电器

关闭模式充电的功能从/system移至/vendor 。对于搭载 Android 13 的设备,如果它们支持关闭模式充电,则 HAL 服务二进制文件必须支持充电器模式。为此,请参阅实施充电器

充电器系统属性

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