对用户而言,一个APP的耗电量直接影响着用户的使用体验。从开发者角度来说,一款优秀的应用,应该兼具一流的用户体验与可靠的产品质量。
手机作为一个便携的移动设备,受限于电池容量及硬件性能的限制,使得应用的性能优化变得格外重要,而耗电量优化却是常常容易被忽略的。本文将着重总结应用的耗电量分析工具与优化方法。

影响因素

硬件模块
如GPS模块、WIFI模块、屏幕、基带芯片等。处于待机状态时,各模块耗电量极少。一旦唤醒屏幕,各模块便开始继续工作。

移动数据
典型的 3G 无线电网络有三种能量状态:

  1. Full power:当无线连接被激活的时候,允许设备以最大的传输速率进行操作。
  2. Low power:一种中间状态,对电量的消耗差不多是 Full power 状态下的50%。
  3. Standby:最小的能量状态,没有被激活或者需求的网络连接。
    每次创建一个新的网络连接,无线电波就切换到 full power 状态。在上面典型的 3G 无线电波状态机情况下,无线电波会在传输数据时保持在 full power 的状态(加上一个附加的5秒拖尾时间),再之后会经过12秒的 low power 能量状态。因此对于典型的 3G 设备,每一次数据传输的会话都会导致无线电波消耗大概20秒时间来提取电能。
    频繁的网络导致无线电波迟迟无法进入休眠状态,导致电量消耗快速增长。

WakeLock
在Android系统中,为了节省电量资源,系统会通过休眠,关闭硬件等操作来降低功耗。例如在锁屏时,CPU会进入睡眠状态,后台任务停止运行,网络请求被中止。很多应用为了继续工作,使用PowerManager.WakeLock保持CPU运行,使CPU一直处于运行状态,大大增加了耗电量。

分析工具

Battery Historian
Battery Historian是Google提供的开源的电量分析工具,目前仅支持Android 5.0及以上的设备。

安装步骤参见官方文档:Battery Historian

在获取手机电量统计数据之前需清空历史数据并开启详细日志:

1
adb shell dumpsys batterystats --reset
1
adb shell dumpsys batterystats --enable full-wake-history

获取电量统计数据,注意Android7.0及以上版本获取方式有所不同

1
2
#Android7.0+
adb bugreport bugreport.zip
1
2
#Android6.0-
adb bugreport > bugreport.txt

上传数据并分析,需要注意的是Battery Historian需要科学上网才能提交分析。

横坐标代表时间范围,纵坐标参数说明请参考Android性能专项测试之battery-historian
由下图可知,CPU一直处于运行状态,消耗了大量电量。移动数据请求频繁,无线电波持续工作,导致电量一直被消耗。

在App Selection中选择要分析的应用,在App Stats中Device estimated power use可得知APP耗电量为**8.14%**。

优化过程

经过排查,最终定位在日志上报及注册设备ID的请求过于频繁,并做以下优化。
* 降低网络请求频率,集中处理网络请求,可通过Job Scheduler来实现调度。
* 检查WakeLock唤醒锁,避免不必要唤醒操作。
* 将数据上报等非重要性工作,在WIFI下或接入电源时执行。

优化成果

在同一时间范围,对比可得可见CPU运行不再频繁,App耗电量下降至**2.62%**。

参考资料

Android性能优化之电量篇
How to know your application’s battery stats