现象
APP耗电,导致电池续航能力不佳,如下图,在小米MIX2和iPhone X机型上后台静默一小时各应用的耗电排行:
基本概念
相对于PC来说,移动设备的电池电量是非常有限的,保持持久的续航能力尤为重要。另外,Android的很多特性都比较耗电(如屏幕、GPS、sensor传感器、唤醒机制、CPU、连网等的使用),我们必须要慎重检查APP的电量使用,以免导致用户手机耗电发热,带来不良体验。
场景设计
主要的耗电场景有:
- cpu:复杂的运算逻辑、死循环等会直接导致CPU负载过高,会导致耗电;
- wakelock:只要有应用拿到wakelock这个锁,系统就无法进入睡眠状态。频繁wakelock或者申请了wakelock没有释放,会导致耗电;
- wifiscan和wifilock:wifiscan和wifilock也会导致手机的wifi模块处于激活状态,频繁的wifiscan或者wifilock不释放,会导致耗电;
- sensor:传感器打开后会导致系统持续监听设备外围环境的数据变化,使用后不及时关闭,会导致耗电;
- network:大量的数据传输,或者长时间的移动网络数据传输导致radio长期处于活跃状态,会导致耗电;
- gps:gps也是一种传感器,定位中没有及时关闭,会导致耗电;
业务层面,用户最核心基础的模块:
- 新增的基础逻辑,倘若入口明显,潜在较大访问,必须保证性能;
- 活动需要,因为活动上新的逻辑,存在较大的用户访问,需尽力提升用户体验;
- 反馈体验不好的模块;
监控分析
耗电原理
1、各部件单位时耗电:各部件单位时耗电信息保存在power_profile.xml文件中,如下图(以魅族MX6为例):
2、运行时长
电量(mAh)=各部件单位时耗电量(mA)*各部件运行时长(h)
数据获取
测试环境
1、恢复出厂设置,排除其他APP对耗电的影响,减少干扰因素;
2、测试过程中,不出现充电情况;
3、Android 5.0 以上的设备;
4、通过wifi连接电脑和手机;
adb tcpip 5555 adb connect 192.168.1.101 (Android设备IP地址)
测试步骤
1、首先,电脑用数据线连接手机设备,开启设备的开发者模式后,使用adb devices命令,能够看到设备在线
2、然后,默认情况下,android系统不会记录特定应用的wakelock变化,为了依照时间顺序,展示各个 wakelock的详细信息,需要先执行命令:
adb shell dumpsys batterystats --enable full-wake-history
3、接着需要重置batterystats数据:
adb shell dumpsys batterystats --reset
4、接下来可以拔掉数据线,在手机上对被测试app执行相应的用例进入测试场景
5、操作完成后,电脑再次连接设备,执行命令:
adb shell dumpsys batterystats > xxx.txt # 因为bugreport时间比较长,我们放到后面执行来减少与前面dumpsys的数据的偏差 Android 7.0及以上: adb bugreport bugreport.zip Android 6.0及以下: adb bugreport > bugreport.txt
6、打开Battery Historian平台将bugreport.txt导入, 并点击submit进行分析