Android发热监控实践

在此也只是粗略介绍当前已经做的针对发热治理的一些初步工作,以及对未来发热功耗相关开展的思路,希望能让 App 带来更好的体验 , 给用户带来更对美好事物的向往的感受 。?一、背景相信移动端高度普及的现在 , 大家或多或少都会存在电量焦虑 , 拥有过手机发热发烫的糟糕体验 。而发热问题是一个长时间、多场景的指标存在 , 且涉及到端侧应用层、手机 ROM 厂商系统、外界环境等多方面的影响 。如何有效衡量发热场景、定位发热现场、以及归因发热问题成为了端侧应用层发热监控的面前的三座大山 。本文通过得物 Android 端侧现有的一些监控实践,不深入功耗计算场景无法自拔,优先聚焦于发热场景本身,希望能给大家一些参考 。
二、发热定义温度是最直观能反映发热问题的指标 , 当前 Android 侧,我们以体感温度 37° 以上作为分界线,向上每 3° 作为一个发热温度区间,区间细分上限温度 49°,即划分出 37-40,40-43,43-46,46-49,49+ 五个等级 。
以手机温度、CPU 使用率作为第一、第二要素来判断用户是否发热的同时 , 获取其他参数来支撑发热现场情况 。
具体指标如下:
手机温度 CPU 使用率、GPU 使用率;
线程堆栈;
系统服务使用频次;
设备前后台、亮灭屏时长;
电量、充电情况;
热缓解发热等级;
系统机型、版本;
....
三、指标获取温度

  • 电池温度系统 BatteryManger 已经提供了一系列自带的接口和粘性广播获取电池信息 。BatteryManager.EXTRA_TEMPERATURE 广播 , 获取的温度值是摄氏度为单位的 10 倍数值 。
//获取电池温度BatteryManager.EXTRA_TEMPERATURE,华氏温度需要除以10fun getBatteryTempImmediately(context: Context): Float {return try {val batIntent = getBatteryStickyIntent(context) ?: return 0fbatIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) / 10F} catch (e: Exception) {0f}}private fun getBatteryStickyIntent(context: Context): Intent? {return try {context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))} catch (e: Exception) {null}}BatteryManager 除支持电池温度的系统广播外,也包含电量、充电状态等额外信息的读?。?均定义在其源码中 。
以下罗列几个值得关注的://BATTERY_PROPERTY_CHARGE_COUNTER 剩余电池容量,单位为微安时//BATTERY_PROPERTY_CURRENT_NOW 瞬时电池电流,单位为微安//BATTERY_PROPERTY_CURRENT_AVERAGE 平均电池电流,单位为微安//BATTERY_PROPERTY_CAPACITY 剩余电池容量,显示为整数百分比//BATTERY_PROPERTY_ENERGY_COUNTER 剩余能量 , 单位为纳瓦时// EXTRA_BATTERY_LOW是否认为电量低// EXTRA_HEALTH电量健康常量的常数// EXTRA_LEVEL电量值// EXTRA_VOLTAGE 电压// ACTION_CHARGING进入充电状态// ACTION_DISCHARGING进入放电状态
  • 传感器温度Android是基于linux 基础上修改的开源操作系统,同样的在手机系统sys/class/thermal/ 目录下存在以 thermal_zoneX 为代表各传感器的温度分区,以及 cooling_deviceX 为代表风扇或散热器等冷却设备 。以一加 9 为例,共存在 105 个温度传感器 or 温度分区,以及 48 个冷却设备 。
每个温度分区下记录下具体的参数类型,我们重点关注的是 type 文件和 temp 文件,分别记录了该传感器设备的名称,以及当前的传感器温度 。以 thermal_zone29 为例,代表了 CPU 第一核心的 第五处理单元的温度值为 33.2 摄氏度 。而对单一设备来说分区对应的名称是固定的,从而我们可以通过读取 thermal_zone 文件的方式来记录当前第一个 type 文件名称包含 CPU 的传感器作为 CPU 温度 。
Android发热监控实践

文章插图
图片
  • 壳温Android 10 google 官方推出了热缓解框架 , 通过 HAL2.0 框架监听底层硬件传感器(主要为 USB 传感器、Skin 传感器)提供 USB、壳温的热信号等级变更监听,系统 PowerManager 源码提供了对应发热等级变更的回调和发热等级的获?。??7 个等级,提供给开发者主动或被动获取 。

Android发热监控实践

文章插图
图片
final PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);powerManager.addThermalStatusListener(new PowerManager.OnThermalStatusChangedListener() {@Overridepublic void onThermalStatusChanged(int status) {//返回对应的热状态}});


推荐阅读