散热缓解

借助 Android 框架,设备制造商和应用开发者可以使用散热数据来确保用户体验 (UX) 的一致性(如果设备开始过热)。例如,当系统承受散热压力时,jobscheduler 作业会受到限制,并且在必要时,会启动框架散热关机。通过在 PowerManager中注册的回调接收散热压力通知的应用可以优雅地调整其 UX。

散热 HAL

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

Android 10 在 Android 框架中引入了散热系统,以及新版本的 HAL(Thermal HAL 2.0),该 HAL 抽象化了与散热子系统硬件设备的接口。硬件接口包括用于皮肤、电池、GPU、CPU 和 USB 端口的温度传感器和热敏电阻。设备皮肤温度是保持设备表面温度在指定散热限制范围内的最重要系统跟踪参数。

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

Overheat warnings.

图 1. 过热警告。

当前温度是通过 热传感器类型,使用 IThermal HAL 检索的。每个函数调用都会返回一个状态值,即 SUCCESSFAILURE。如果返回 SUCCESS,则进程继续。如果返回 FAILURE,则会将一条人类可读的错误消息发送到 status.debugMessage

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

除了热传感器信息之外,缓解冷却设备的列表也暴露在 getCurrentCoolingDevices 中。即使冷却设备已离线,此列表的顺序也是持久的。设备制造商可以使用此列表来收集 statsd 指标。

有关更多信息,请参阅参考实现

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

热服务

在 Android 10 及更高版本中,框架中的热服务使用来自 Thermal HAL 2.0 的各种缓解信号进行持续监控,并向其客户端提供节流严重性反馈。这些客户端包括内部组件和 Android 应用。该服务使用两个 Binder 回调接口,IThermalEventListenerIThermalStatusListener,作为回调公开。前者供内部平台和设备制造商使用,后者供 Android 应用使用。

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

Thermal mitigation process flow in Android 10 and higher.

图 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 中,并报告所采取的任何缓解措施的严重程度。从传感器读数返回的温度值不必是实际温度,只要它准确地反映了相应的严重性阈值即可。例如,您可以传递不同的数值而不是实际温度阈值,或者您可以在阈值规范中构建保护带以提供迟滞。但是,与该值对应的严重性必须与该阈值所需的值匹配。例如,您可能会决定将 72°C 作为您的临界温度阈值返回,而实际温度为 65°C,并且它对应于您指定的临界严重性。严重性级别必须准确,才能获得最佳的热框架功能。

要阅读有关框架中阈值级别以及它们如何对应于缓解措施的更多信息,请参阅使用热状态代码

使用热 API

应用可以添加和删除监听器,并通过 PowerManager 类访问热状态信息。IThermal 接口提供了所需的所有功能,包括返回热状态值。IThermal binder 接口 被包装为 OnThermalStatusChangedListener 接口,应用可以在注册或删除热状态监听器时使用该接口。

Android 热 API 具有回调和轮询方法,供应用通过状态代码获知热严重性级别,这些状态代码在 PowerManager 类中定义。这些方法包括

使用热状态代码

热状态代码转换为特定的节流级别,您可以将其用于收集数据和设计最佳 UX。例如,应用可能会收到状态 0x00000000 (THERMAL_STATUS_NONE),稍后可能会更改为 0x00000001 (THERMAL_STATUS_LIGHT)。将 0x00000000 状态标记为 t0,然后测量从状态 THERMAL_STATUS_NONE 到状态 THERMAL_STATUS_LIGHT 经过的时间 t1,使设备制造商能够为特定用例设计和测试缓解策略。下表概述了使用热状态代码的建议方法

热状态代码 描述和建议用途
THERMAL_STATUS_NONE (0x00000000) 无节流。使用此状态来实现保护措施,例如检测从 THERMAL_STATUS_NONE (0) 到 THERMAL_STATUS_LIGHT (1) 的时间段 (t0 到 t1) 的开始。
THERMAL_STATUS_LIGHT (0x00000001) 轻微节流,UX 不会受到影响。在此阶段使用温和的设备缓解措施。例如,跳过加速或使用低效频率,但仅限于大核。
THERMAL_STATUS_MODERATE (0x00000002) 中度节流,UX 不会受到很大影响。热缓解会影响前台活动,因此应用应立即降低功耗。
THERMAL_STATUS_SEVERE (0x00000003) 严重节流;UX 受到很大影响。在此阶段,设备热缓解应限制系统容量。此状态可能会导致副作用,例如显示卡顿和音频抖动。
THERMAL_STATUS_CRITICAL (0x00000004) 平台已尽一切努力降低功耗。设备热缓解软件已将所有组件置于最低容量运行。
THERMAL_STATUS_EMERGENCY (0x00000005) 平台中的关键组件由于热条件而关闭,并且设备功能受到限制。此状态代码表示设备关机前的最后警告。在此状态下,某些功能(例如调制解调器和蜂窝数据)将完全关闭。
THERMAL_STATUS_SHUTDOWN (0x00000006) 立即关机。由于此阶段的严重性,应用可能无法收到此通知。

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