Android Thermal 热缓解机制详解
Android Thermal 热缓解机制详解
Android系统的热管理机制对于确保设备在各种使用场景下都能保持良好的用户体验至关重要。本文将深入探讨Android系统的热缓解框架,包括Thermal HAL的版本演进、热服务的工作原理以及设备制造商和应用开发者如何使用相关API来优化用户体验。
借助该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_PORT和SKIN传感器的IThermalEventListener回调接口分别达到THERMAL_STATUS_EMERGENCY严重级别时,系统便会显示这些消息。
图 1. 过热警告。
系统会通过IThermal HAL为不同类型的热传感器检索当前温度。每个函数调用都会返回一个状态值:SUCCESS或FAILURE。如果返回SUCCESS,进程将继续。如果返回FAILURE,系统会向status.debugMessage发送一条错误消息,该消息必须采用人类可读懂的格式。
注意:对于Android 14,我们已将IThermal HAL从HIDL迁移到AIDL。如需Android 14中热传感器类型的列表,请参阅TemperatureType.aidl和CoolingType.aidl
除了作为可返回当前温度的轮询接口之外,您还可以使用回调IThermalChangedCallback(HIDL,Android 10到13)或IThermalChangedCallback(AIDL,Android 14及以上版本)与Thermal HAL客户端中的回调接口一起使用,例如框架的热服务。例如,RegisterIThermalChangedCallback和UnregisterIThermalChangedCallback可用于注册或取消注册严重级别发生改变的事件。如果指定传感器的热严重级别发生了变化,notifyThrottling会向热事件监听器发送温控降频事件回调。
除了热传感器信息外,getCurrentCoolingDevices还提供一个进行了缓解操作、正在冷却的设备的列表。即使某个冷却设备已离线,该列表顺序仍保持不变。设备制造商可以利用该列表收集statsd指标。
如需了解详情,请参阅参考实现。虽然您可以添加自己的扩展,但绝不能停用热缓解功能。
热服务
在Android 10及以上版本中,框架中的热服务利用来自Thermal HAL 2.0的各类缓解信号不断进行监控,并向其客户端提供有关限制严重级别的反馈,这些客户端包括内部组件和Android应用。该服务使用2个Binder回调接口,即作为回调提供的IThermalEventListener和IThermalStatusListener。前者适用于内部平台和设备制造商,而后者适用于Android应用。
通过回调接口,设备的当前热状态能够以整数值的形式检索到,该值的范围为0x00000000(未限制)到0x00000006(设备关机)。只有可信系统服务(例如Android API或设备制造商API)才能访问详细的热传感器和热事件信息。下图介绍了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类中定义的状态代码将热严重级别告知应用。这些方法包括:
- getCurrentThermalStatus()能够以整数形式返回设备的当前热状态(除非该设备正处于受限状态)。
- addThermalStatusListener()可添加一个监听器。
- removeThermalStatusListener()可移除之前添加的监听器。
使用热状态代码
热状态代码可转化为具体的限制级别,用于收集数据和设计最佳用户体验。例如,应用可能会收到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) | 轻微限制,用户体验不受影响。在此阶段,请对设备采取温和的缓解操作。例如,不要提频或采用低效频率(仅适用于大核心)。 |
THERMAL_STATUS_MODERATE(0x00000002) | 中等限制,用户体验没有受到很大影响。执行的热缓解操作会影响前台activity,因此应用应立即减少耗电量。 |
THERMAL_STATUS_SEVERE(0x00000003) | 严重限制;用户体验在很大程度上受到影响。在此阶段,设备热缓解措施应该会限制系统容量。此状态可能会导致显示卡顿和音频抖动等负面影响。 |
THERMAL_STATUS_CRITICAL(0x00000004) | 平台已采取一切措施减少耗电量。设备热缓解软件已经以最低容量运行所有组件。 |
THERMAL_STATUS_EMERGENCY(0x00000005) | 平台中的关键组件因热状况而即将关闭,且设备功能受到限制。此状态代码表示系统在设备关机前发出的最后一次警告。在此状态下,调制解调器和移动数据网络等一些功能会完全关闭。 |
THERMAL_STATUS_SHUTDOWN(0x00000006) | 立即关机。鉴于此阶段的严重级别,应用可能无法收到此通知。 |
设备制造商必须通过Thermal HAL的VTS测试,并且可以使用内核sysfs接口中的emul_temp模拟温度变化。
本文原文来自CSDN