热缓解

借助该 Android 框架,设备制造商和应用开发者可以使用热数据来确保在设备开始过热时保持一致的用户体验 (UX)。例如,当系统温度较高时,jobscheduler 作业会受到限制,如有必要,可启动框架热关机。通过注册的回调函数(位于 PowerManager中)接收高温通知的应用可妥善调整其用户体验。

Thermal HAL

Android 9 及更低版本使用 Thermal HAL 1.0 中定义的轮询接口获取温度读数。此 HAL 允许 Android 框架和其他可信客户端(例如设备制造商的 HAL)通过同一 API 读取每个传感器的当前温度和产品政策特定的限制和关闭阈值。

Android 10 在 Android 框架中引入了热系统,以及一个新的 HAL 版本,即 Thermal HAL 2.0,用于将热子系统硬件设备的接口抽象化。硬件接口包括设备表面、电池、GPU、CPU 和 USB 端口的温度传感器和热敏电阻。为了确保设备表面温度不超过指定的热限制值,系统需要跟踪设备表面温度,这一点至关重要。

此外,Thermal HAL 2.0 可为多个客户端提供热传感器读数及相关严重级别,以指示受热情况。下图显示了 2 条来自 Android 系统界面的警告消息。当 USB_PORTSKIN 传感器的 IThermalEventListener 回调接口分别达到 THERMAL_STATUS_EMERGENCY 严重级别时,系统便会显示这些消息。

过热警告。

图 1. 过热警告。

系统会通过 IThermal HAL 为不同类型的热传感器检索当前温度。每个函数调用都会返回一个状态值:SUCCESSFAILURE。如果返回 SUCCESS,进程将继续。如果返回 FAILURE,系统会向 status.debugMessage 发送一条错误消息,该消息必须采用人类可读懂的格式。

除了作为可返回当前温度的轮询接口之外,您还可以使用回调 IThermalChangedCallback(HIDL,Android 10 到 13)IThermalChangedCallback(AIDL,Android 14 及更高版本)与 Thermal HAL 客户端中的回调接口一起使用,例如框架的热服务。例如,RegisterIThermalChangedCallbackUnregisterIThermalChangedCallback 可用于注册或取消注册严重级别发生改变的事件。如果指定传感器的热严重级别发生了变化,notifyThrottling 会向热事件监听器发送温控降频事件回调。

除了热传感器信息外,getCurrentCoolingDevices 还提供一个进行了缓解操作、正在冷却的设备的列表。即使某个冷却设备已离线,该列表顺序仍保持不变。设备制造商可以利用该列表收集 statsd 指标。

如需了解详情,请参阅参考实现

虽然您可以添加自己的扩展,但绝不能停用热缓解功能。

热服务

在 Android 10 及更高版本中,框架中的热服务利用来自 Thermal HAL 2.0 的各种缓解信号不断进行监控,并向其客户端提供有关限制严重级别的反馈,这些客户端包括内部组件和 Android 应用。该服务使用 2 个 Binder 回调接口,即作为回调提供的 IThermalEventListenerIThermalStatusListener。前者适用于内部平台和设备制造商,而后者适用于 Android 应用。

通过回调接口,设备的当前热状态能够以整数值的形式检索到,该值的范围为 0x00000000(未限制)到 0x00000006(设备关机)。只有可信系统服务(例如 Android API 或设备制造商 API)才能访问详细的热传感器和热事件信息。下图介绍了 Android 10 及更高版本中热缓解处理流程的模型。

Android 10 及更高版本中的热缓解处理流程。

图 2. Android 10 及更高版本中的热缓解处理流程。

设备制造商使用准则

如需报告 Android 10 到 13 的设备温度传感器和限制状态,设备制造商必须实现 Thermal HAL 2.0 的 HIDL 方面 (IThermal.hal)。

如需报告 Android 14 的设备温度传感器和限制状态,设备制造商必须实现 Thermal HAL 2.0 的 AIDL 方面 (IThermal.aidl)。

限制设备性能的任何因素(包括电池电量限制)都必须通过 Thermal HAL 进行报告。为确保做到这一点,请将可能会指示需要进行缓解操作(根据状态变化)的所有传感器放入 Thermal HAL,并报告所采取的任何缓解操作所对应的严重级别。从传感器读数返回的温度值不一定是实际温度,只要它准确反映相应的严重级别阈值即可。例如,您可以传递不同的数值而非实际温度阈值,也可以在阈值规范中建立保护带以提供迟滞功能。不过,与该值对应的严重级别必须与在相应阈值所需达到的级别一致。例如,当实际温度为 65°C,且该温度的严重级别对应于您指定的“严重”时,您可以考虑返回 72°C 作为临界温度阈值。严重级别必须准确无误,以便充分发挥热框架的功能。

如需详细了解框架中的阈值级别及其如何与各缓解操作一一对应,请参阅使用热状态代码

使用 Thermal API

应用可以通过 PowerManager 类来添加和移除监听器以及获取热状态信息。IThermal 接口提供了所需的所有功能,包括返回热状态值。IThermal Binder 接口封装为 OnThermalStatusChangedListener 接口,供应用在注册或移除热状态监听器时使用。

Android Thermal API 提供了回调和轮询这两种方法,以便通过在 PowerManager 类中定义的状态代码将热严重级别告知应用。这些方法包括:

使用热状态代码

热状态代码可转化为具体的限制级别,用于收集数据和设计最佳用户体验。例如,应用可能会收到 0x00000000 (THERMAL_STATUS_NONE) 状态,该状态稍后可能会更改为 0x00000001 (THERMAL_STATUS_LIGHT)。将 0x00000000 状态标记为 t0,然后衡量从状态 THERMAL_STATUS_NONE 更改为状态 THERMAL_STATUS_LIGHT(作为 t1)所经过的时间,这样一来,设备制造商就能针对特定用例设计和测试缓解策略。下表概述了使用热状态代码的建议方法:

热状态代码 说明和建议用法
THERMAL_STATUS_NONE0x00000000 未限制。此状态代码可用于实施保护操作,例如,检测从 THERMAL_STATUS_NONE (0) 到 THERMAL_STATUS_LIGHT (1) 的时间段(从 t0 到 t1)的起始时间。
THERMAL_STATUS_LIGHT0x00000001 轻微限制,用户体验不受影响。在此阶段,请对设备采取温和的缓解操作。例如,不要提频或采用低效频率(仅适用于大核心)。
THERMAL_STATUS_MODERATE0x00000002 中等限制,用户体验没有受到很大影响。执行的热缓解操作会影响前台 activity,因此应用应立即减少耗电量。
THERMAL_STATUS_SEVERE0x00000003 严重限制;用户体验在很大程度上受到影响。在此阶段,设备热缓解措施应该会限制系统容量。此状态可能会导致显示卡顿和音频抖动等负面影响。
THERMAL_STATUS_CRITICAL0x00000004 平台已采取一切措施减少耗电量。设备热缓解软件已经以最低容量运行所有组件。
THERMAL_STATUS_EMERGENCY0x00000005 平台中的关键组件因热状况而即将关闭,且设备功能受到限制。此状态代码表示系统在设备关机前发出的最后一次警告。在此状态下,调制解调器和移动数据网络等一些功能会完全关闭。
THERMAL_STATUS_SHUTDOWN0x00000006 立即关机。鉴于此阶段的严重级别,应用可能无法收到此通知。

设备制造商必须通过 Thermal HAL 的 VTS 测试,并且可以使用内核 sysfs 接口中的 emul_temp 模拟温度变化。