如今的移动设备早已无处不在,待机时间成为影响设备最终销量的一个重要因素。类似的,电量消耗也是决定某个应用是否会被安装的重要因素之一。
本文将从基础概念介绍,到数据获取,再到测试场景设计和结果分析和问题定位,带你上手APP应用功耗测试。
一、功耗是什么?
功耗,通俗的理解即电流通过导体是设备运行,导体本身的电阻将电能转换为热能的过程,因此,通常功耗测试也叫电量测试。
那么APP的耗电量是如何计算的?我们先来看看根据Android官方电量统计接口文档得出APP功耗的计算公式如下:
APP功耗=CPU消耗+WakeLock消耗+数据传输消耗(移动网络&WiFi)+WiFi运行+GPS+other sensors。
从公式中我们可以大致看出,一个APP的耗电主要包含CPU消耗、WakeLock消耗、数据传输消耗、GPS定位消耗以及其他传感器的消耗,iOS应用类似。
以下是Android耗电计算的源码,里边定义了每个耗电项的具体计算单位:
这个文件在每部手机出厂时由厂商给出的在Android系统层的文件,因此不同的手机型号相同的指标对应的值未必一样。
二、数据获取
常见的APP电量数据获取有如下方法:
- 系统自带工具
- 硬件测试
- 第三方工具
- 应用集成SDK
- 命令行
- Xcode、Android Studio
1.系统自带工具
1.1 Android
Android系统进入设置-电池和性能-耗电排行,点击具体应用可以看到如下效果:
1.2 iOS
iOS系统进入设置-电池中查看:
使用系统自带工具查看应用耗电情况非常方便直观,缺点是无法对耗电异常与否做出判断、无法进一步分析耗电的原因。
2.硬件测试
如安捷伦、功耗仪,它的优点是无权限要求、测量精确,缺点是测试环境干扰因素多、需拆装手机、结果为整机电量消耗。
具体测试步骤如下:
1.假电池装进待测手机
2.假电池链接稳压电源
3.稳压电源链接已安装电流软件的电脑
4.启动电压和电脑软件,执行测试用例
3.第三方工具
3.1 Android
Android系统第三方测试工具使用如Powerstat(从GT官网下载)、Emmagee,它的优点是展示直观、使用方便,缺点是数据颗粒度大、无法分析定位、部分功能可能需要root。
具体的使用方法这里就不展开了,非常简单。
GT官网
Emmagee下载
Powerstat使用效果如下:
3.2 iOS
iOS系统第三方工具使用DetailedBatteryUsage,它仅支持越狱设备,可以到Cydia中进行下载,该插件支持iOS8-iOS10系统版本。
4.集成SDK
如GT、DoraemonKit,它的优点是展示直观、可获取应用相关线程栈,缺点是对源码有一定侵入、需要一定的开发基础。
这里补充说明一下,GT自动3.0版本之后已经不是以APK的形式使用,而是以SDK的形式集成在应用源码中,详细的集成步骤请参考官方文档。
DoraemonKit
GT
5.命令行
5.1 Android
使用命令行获取电量数据在Android系统应用测试上使用得更广泛。
adb shell dumpsys batterystats(Android 4.4及以上)
adb shell dumpsys batterysinfo(Android 4.1-4.3)
以上命令版本不同结果内容也会有差异
使用方法
1.adb shell dumpsys batterystats --reset 。
2.拔掉手机,操作你的App,操作完成后,重新连接手机,执行下面的命令。
3.adb shell dumpsys batterystats > com.example.android.sunshine.app > batterystats.txt。文件结果分析(部分关键内容)
Battery History 电量相关数据的时间序列
Per-PID Stats 每一个进程执行了多长的时间
Statistics since last charge
Estimated power use (mAh) 电量消耗估算
Per-app mobile ms per packet
All partial wake locks 所有程序中wakelock,关注持续时间和数量
6.开发工具
要使用开发工具直接获取电量数据,一般情况下必须要有源码,而iOS可以通过导入应用电量日志,借助Xcode开发工具进行解读。
6.1 Android
首先介绍Android Studio,将工程编译到测试机上后使用Profile获取app性能数据,点击ENERGY图表,即可查看详细的耗电信息如下:
6.2 iOS有源码
iOS系统开发工具使用的是Xcode自带的iOS电量测试工具Energy log。
操作步骤如下:
1.点击开始按钮,录制 APP 运行情况。
2.看左边的 Energy Log 的指标有 Energy,CPU,Network等等应有尽有。
3.从图中可以看出整个 APP 的能量消耗情况,但是存在一个问题,这个问题就是我们已经知道了APP 的这些能量消耗情况,但是怎么知道要去修改哪里的代码呢?这个时候我们需要 Time Profiler 工具。
点击右上角的Time Profiler +按钮,来记录 APP 在某个时间段的代码运行情况。
4.按照代码执行时间的权重比,逐步找到了 panImage(with yRotation: CGFloat) 方法被频繁调用的地方。
6.3 iOS无源码
1.iOS 设置选项 ->开发者选项->logging ->start recording
2.进行需要测试电量的场景操作后进入开发者选项点击stop recording
3.将iOS设备和Mac连接
4.打开Instrument,选择Energy Diagnostics
5.选择 File > Import Logged Data from Device
6.保存的数据以时间轴输出到Instrument面板,完成
6.4 iOS无源码
sysdiagnose,是获取系统日志的证书,这里要介绍的就是通过系统电量日志分析应用耗电。
操作步骤:
1.通过开发者账号,在苹果官网下载sysdiagnose证书
2.将证书安装在目标手机上,同时按住声音‘+’和‘-’,再按一下锁屏键,手机震动表示sysdiagnose启动成功
3.执行测试用例,在不重启手机的情况下,等待10到30分钟,在手机的设置-通用-隐私-分析-分析数据中有一份命名为sysdiagnose-data的文件
4.将文件通过AIrDrop或其它方式传至电脑
5.使用DB Browser For Sqlit打开文件中以PLSQL为后缀的文件,查看其中的表数据
6.找到如下两张表,先找进程ID,再统计电量表中的所有该进程ID的所有耗电明细
这里PLAccountingOperator_Aggregate_RootNodeEnergy表中字段RootNodeID含义:
node 6 isp图像处理器
node 52 apsocbase除cpu外芯片层耗电
node 10 display 显示
node 11 wifidata
node 8 GPU
node 4 venc视频编码器
node 2 cpu
node 7 restofsoc
三、测试场景
从功耗的计算公式我们可以总结出通常需要覆盖的测试场景:
- 核心流程用例
- 新功能主流程
- 后台运行
- 涉及传感器、GPS、大数据计算、上传、网络扫描的场景
用例设计如下:
四、分析定位
测试分析通常无法通过数据直观的判断是否存在异常,必须借助历史版本数据、竞品数据来作为参考,当某个场景下的耗电量相比竞品或者历史版本有较大的上升时,视为异常,这时我们需要借助以下手段来定位问题所在。
Android
Android应用耗电分析定位推荐使用google开源工具Battery Historian,项目地址.
使用步骤:
1.adb shell dumpsys batterystats --enable full-wake-history //开启日志
2.adb shell dumpsys batterystats --disable full-wake-history //关闭日志
3.adb shell dumpsys batterystats --reset
4.adb bugreport > bugreport.txt //7.0以下 adb bugreport bugreport.zip
5.执行测试用例
6.python historian.py -a bugreport.txt > battery.html
battery.html如下图:
注:报告结果为整机电量消耗详情,测试时请排除其它因素
横坐标:时间线
battery_level:电量,可以看出电量的变化。
plugged:充电状态
screen:屏幕是否点亮
top app:该栏显示当前时刻哪个app处于最上层
Userspace wakelock:该属性是记录wake_lock模块的工作时间
health:电池健康状态的信息
plug:充电方式,usb或者插座,以及显示连接的时间。
Fg:前台进程
iOS
参考6.2、6.3章节。
总结
一个APP的耗电主要包含CPU消耗、WakeLock消耗、数据传输消耗、GPS定位消耗以及其他传感器的消耗,iOS应用类似。
当我们进行APP应用功耗测试时,我们首先可以使用GT测试各个场景中APP电量消耗是否有异常。
当我们确认或者怀疑该场景下存在异常时,如果是Android APP,我们可以采用battery historian分析工具对手机里获取的bugreport文件进行分析,统计app中持有超过一小时的wack_lock和一小时内发生的wackup数。
如果是iOS APP,我们可以直接使用苹果手机里开发者工具记录系统电量日志,测试结束后,将电量日志导入Xcode开发工具中的查看具体是哪些耗电项导致的耗电异常。