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

实施健康 2.1

在Android中11,所有healthd代码被重构到libhealthlooplibhealth2impl ,然后修改以实现health@2.1 HAL。这两个库是静态链接由health@2.0-impl-2.1 ,直通实现健康2.1。静态链接库使health@2.0-impl-2.1做同样的工作healthd ,如运行healthd_mainloop和投票。在初始化中, health@2.1-service注册接口的实现IHealthhwservicemanager 。使用 Android 8.x 或 9 供应商映像和 Android 11 框架升级设备时,供应商映像可能不提供 health@2.1 服务。老厂商的图像向下兼容性是由执行折旧时间表

为确保向后兼容性:

  1. healthd注册IHealthhwservicemanager尽管是一个系统守护进程。 IHealth被添加到系统清单,实例名称为“备份”。
  2. 该框架和storaged沟通healthd通过hwbinder而不是binder
  3. 为框架的代码和storaged改变,以获取实例“默认”如果有的话,那么“备份”。
    • C ++的客户端代码使用中所定义的逻辑libhealthhalutils
    • Java客户端代码使用中所定义的逻辑HealthServiceWrapper
  4. IHealth后/默认是广泛使用和Android 8.1供应商的图片已被弃用,IHealth /备份和healthd可以弃用。有关详细信息,请参阅贬health@1.0

healthd 的特定于板的构建变量

BOARD_PERIODIC_CHORES_INTERVAL_*用于建立特定板变量healthd 。由于该系统/销售商构建分割的一部分,板特异性值不能用于系统的模块中定义。使用这些值被重写在不建议使用的功能healthd_board_init

在health@2.1,供应商可以覆盖这两个周期性琐事在区间值healthd_config传递给健康的实现类构造函数之前结构。健康实现类应继承android::hardware::health::V2_1::implementation::Health

实施 Health 2.1 服务

有关实现卫生2.1服务的信息,请参阅硬件/接口/健康/ 2.1 / README.md

健康客户

health@2.x 有以下客户端:

  • 充电器。使用libbatterymonitorhealthd_common代码被包裹在health@2.0-impl
  • 恢复。到联动libbatterymonitor被包裹在health@2.0-impl 。所有来电BatteryMonitor被调用到更换Health的实现类。
  • BatteryManager。 BatteryManager.queryProperty(int id)是唯一的客户端IBatteryPropertiesRegistrar.getPropertyIBatteryPropertiesRegistrar.getProperty被提供healthd和直接读取/sys/class/power_supply

    出于安全考虑,不允许应用直接调用健康 HAL。在Android中9和更高,粘合剂服务IBatteryPropertiesRegistrar由设置BatteryService代替healthdBatteryService委托调用健康HAL检索请求的信息。

  • BatteryService。在Android的9或更高, BatteryService使用HealthServiceWrapper ,以确定是否从使用默认的医疗服务实例vendor或从使用备份卫生服务实例healthdBatteryService然后侦听通过公共卫生事件IHealth.registerCallback

  • 蓄能。在Android的9或更高, storaged用途libhealthhalutils ,以确定是否从使用默认的医疗服务实例vendor或从使用备份卫生服务实例healthdstoraged然后侦听通过公共卫生事件IHealth.registerCallback并检索存储的信息。

SELinux 的变化

health@2.1 HAL 包括平台中的以下 SELinux 更改:

  • 添加android.hardware.health@2.1-servicefile_contexts

对于有自己实现的设备,可能需要一些供应商 SELinux 更改。例子:

# device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
# Add device specific permissions to hal_health_default domain, especially
# if it links to board-specific libhealthd or implements storage APIs.

内核接口

healthd守护进程和默认实现android.hardware.health@2.0-impl-2.1访问内核接口来获取电池信息如下:

  • /sys/class/power_supply/*/capacity_level (卫生2.1加)
  • /sys/class/power_supply/*/capacity
  • /sys/class/power_supply/*/charge_counter
  • /sys/class/power_supply/*/charge_full
  • /sys/class/power_supply/*/charge_full_design (卫生2.1加)
  • /sys/class/power_supply/*/current_avg
  • /sys/class/power_supply/*/current_max
  • /sys/class/power_supply/*/current_now
  • /sys/class/power_supply/*/cycle_count
  • /sys/class/power_supply/*/health
  • /sys/class/power_supply/*/online
  • /sys/class/power_supply/*/present
  • /sys/class/power_supply/*/status
  • /sys/class/power_supply/*/technology
  • /sys/class/power_supply/*/temp
  • /sys/class/power_supply/*/time_to_full_now (卫生2.1加)
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

任何设备特定的健康HAL实现,它使用libbatterymonitor默认访问这些内核接口,除非在健康的实现类的构造函数重载。

如果这些文件丢失或无法访问,从healthd或默认服务(如文件是一个符号链接到供应商的特定文件夹,否认因为错误配置SELinux策略的访问),它们可能无法正常工作。因此,即使使用默认实现,也可能需要额外的特定于供应商的 SELinux 更改。

在健康2.1中使用的一些内核接口,例如/sys/class/power_supply/*/capacity_level/sys/class/power_supply/*/time_to_full_now ,可能是可选的。但是,为了防止丢失内核接口导致不正确的行为框架,建议樱桃采摘CL 1398913构建健康HAL 2.1服务之前。

测试

Android的11包括新的VTS测试专门为health@2.1 HAL写的。如果设备在设备清单中声明 health@2.1 HAL,则它必须通过相应的 VTS 测试。测试是两者的默认实例书面(以确保设备实现了正确HAL)和备份实例(确保healthd继续正常运行它被删除之前)。

电池信息要求

Health 2.0 HAL 对 HAL 接口提出了一组要求,但相应的 VTS 测试在执行这些要求时相对宽松。在 Android 11 中,添加了新的 VTS 测试以对搭载 Android 11 及更高版本的设备实施以下要求:

  • 瞬时和平均电池电流的单位必须是微安 (μA)。
  • 瞬时和平均电池电流的符号必须正确。具体来说:
    • 当前== 0时电池状态为UNKNOWN
    • 电流> 0时的电池状态是CHARGING
    • 电流<= 0时的电池状态是NOT_CHARGING
    • 电流<0时的电池状态是DISCHARGING
    • 不强制执行时,电池状态为FULL
  • 电池状态必须与电源是否连接正确。具体来说:
    • 电池状态必须是一个CHARGINGNOT_CHARGING ,或FULL当且仅当一个电源被连接;
    • 电池的状态必须为DISCHARGING当且仅当电源被断开。

如果您使用libbatterymonitor在您的实现,并通过从内核接口值,确保节点报告正确值的sysfs:

  • 确保使用正确的符号和单位报告电池电流。这包括以下 sysfs 节点:
    • /sys/class/power_supply/*/current_avg
    • /sys/class/power_supply/*/current_max
    • /sys/class/power_supply/*/current_now
    • 正值表示进入电池的电流。
    • 值应以微安 (μA) 为单位。
  • 确保以微伏 (μV) 为单位报告电池电压。这包括以下 sysfs 节点:
    • /sys/class/power_supply/*/voltage_max
    • /sys/class/power_supply/*/voltage_now
    • 需要注意的是默认的HAL实现分歧voltage_now在毫伏(mV)1000和报告值。见@ 1.0 :: HealthInfo

有关详细信息,请参阅Linux的电源类