一、耗电量测试分析
相对于PC端来说,移动设备的电池电量是非常有限的,保持持久的续航能力尤为重要。Android的很多特性都比较耗电(如屏幕、GPS、sensor传感器、唤醒机制、CPU、连网等的使用),我们必须要慎重检查APP的电量使用,以免导致用户手机耗电发热,带来不良体验。
1、耗电场景
主要的耗电场景有:
-
cpu:复杂的运算逻辑、死循环等会直接导致CPU负载过高,会导致耗电;
-
wakelock:只要有应用拿到wakelock这个锁,系统就无法进入睡眠状态。频繁wakelock或者申请了wakelock没有释放,会导致耗电;
-
wifiscan和wifilock:wifiscan和wifilock也会导致手机的wifi模块处于激活状态,频繁的wifiscan或者wifilock不释放,会导致耗电;
-
sensor:传感器打开后会导致系统持续监听设备外围环境的数据变化,使用后不及时关闭,会导致耗电;
-
network:大量的数据传输,或者长时间的移动网络数据传输导致radio长期处于活跃状态,会导致耗电;
-
gps:gps也是一种传感器,定位中没有及时关闭,会导致耗电;
业务层面,用户最核心基础的模块:
-
新增的基础逻辑,倘若入口明显,潜在较大访问,必须保证性能;
-
活动需要,因为活动上新的逻辑,存在较大的用户访问,需尽力提升用户体验;
-
反馈体验不好的模块。
2、耗电量测试
获取测试结果时我们要注意数据的有效性,避免数据误差,让数据更有效的说明问题,下面提供两种方法,来提高获取数据的有效性。
-
横向对比法:分两步测试,第一步测量手机硬件运行消耗的电量;第二步测试手机硬件和软件运行综合的耗电量。最后将两次的耗电进行对比,得出软件消耗的电量大小;
-
纵向对比法:同时进行两台手机,其中一台手机不运行软件,另一台手机运行软件;分别获得两台手机的耗电量,对比两台手机耗电量差异,得出软件消耗的电量大小。
这两种方法在测试上有一定的差异,很多应用软件都是需要移动网络的支持,而手机接收的网络信号是会随时间变化的。
-
第一种方法的误差主要来源于手机在不同的基站网络下工作状态的变化。
-
第二种方法的差异则体现在两台手机本身硬件消耗的电量可能存在差异,所以需要尽可能使用同一型号,同一批次的手机。
二、IOS端耗电量测试
1、常规测试法
(1) 测试方法
①选定测试场景及时长;
②手机充电,放电,手机电量达到预设值,每个场景开始前,保持电量都是这一电量,并且手机是室温;
③手机系统设置,一般关注蓝牙、定位、通知消息、音量、后台应用等等,都设置为预定的状态;
④记录剩余电量,开始执行测试,测试完毕后再记录一次剩余电量,电量差就是这个时长内的耗电量。
(2) 测试结果准确性
这样的测试方法,明显的耗电问题可以发现,比如一次测试掉电10%,但是一些不太明显的问题用这个方法无法发现。另外这种测试方法没有具体的数据,实用性不强。
2、Energy Impact
(1) 测试方法
开发过程中,运行调试模式就可以在Xcode里直接查看Energy Impact。电量仪表盘上有3个区域,如果经常跑到红色区域那就该检讨下自己代码。下面的柱状图会告诉你耗电的组成部分:CPU,Network,Location,GPU,其中Overhead表示不是由App引起的耗电。如果有问题,可以进一步通过快捷入口打开Time Profile,Network Profile,Location Profile做进一步细致排查问题点。
(2) 测试结果准确性
利用Energy Impact测电量很简单,缺点就是必须连上真机,只适合开发人员;而且对于耗电只能给出定性,没有定量的显示。
3、Sysdiagnose耗电量测试
Sysdiagnose是苹果的日志系统,Sysdiagnose很庞大,记录电池、第三方APP、各种系统功能和应用的所有运行情况。通过Sysdiagnose我们可以获取电量消耗,电压,电流,温度,甚至系统的 CPU、GPU 等等耗电都有详细的数据。而且不单单是自己的 App,手机内安装的其它的 APP 同样可以获取到数据,这样大大方便了我们做出详细的对比测试数据。
(1) 测试方法
①Sysdiagnose需要一个开发者账号,在苹果开发者官网Profiles and Logs下载证书BatteryLife.mobileconfig。
传送门:https://developer.apple.com/bug-reporting/profiles-and-logs/
如下所示:
②将证书发送到手机(如airdrop方式),在手机上安装该证书,安装之后,手机不需要越狱也可以获得数据。
③手机端执行测试
测试前,手机端先充电到80%以上,充电完毕后拔出充电线,不做任何操作静置10min后开始执行场景;测试时需将屏幕亮度最低、蓝牙关闭、推送消息关闭、定位开启(在系统设置-隐私里开启)、音量最低、个人热点关闭、后台进程全关闭;
进入APP,根据测试用例设计的测试场景进行测试;
⚠️注意事项:
-
电量测试如果是对比测试,两个版本的初始电量尽量保持一致;
-
每个场景开始执行和结束时,记录开始和结束的时间,每个场景之间间隔1min(目前是一个场景操作10min);
-
测试时不能中途充电;
-
同步数据,并导出电量数据文件
上一步操作完所有场景,测试完成后,手机静置约半小时(因为数据库写入会有延迟),然后手机连接电脑,同步数据;
同步完成后,导出需要的电量日志,导入日志地址方法如下:
Mac:
打开Finder,按 CMD+SHIFT+G,并输入:
Win:
C:\Users[Your_User_Name]\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\[Your_Device_Name]\
④在指定路径的文件夹内找到对应耗电量数据,耗电量数据一般是以powerlog开头,.PLSQL或着.PLSQL.gz结束,如下图所示:
⑤使用DB Browser for SQLite可以查看数据,打开powerlog数据库,切换到“浏览数据”tab,可以看到这个数据库中有许多表,如下所示:
⑥测试结果分析
这些表中,和电量相关的几个重要的表的名字和作用如下:
其中最重要的表是PLBatteryAgent_EventBackward_Battery整机电量信息,每20s采集一次,在关闭其他app的情况下,可以近似的认为是所测app的耗电,表内容如下:
PLBatteryAgent_EventBackward_Battery 表中每一行最前面都有个 timestamp,这是用来记录每行电池状况记录的时间点(为 UnixTime格式,可以通过时间转换工具进行转换获取具体时间),因此可以根据记录的时间戳进行耗电量数据的提取,表中记录了对应时间戳的手机剩余电量,电压,电流(正数是在充电,负数是耗电),表中还有温度数据,可以反映测试期间手机的温度变化。
表中第二列是时间戳timestamp,第四列Rawlevel是对应时间点的电量值,统计电量时,通过测试场景开始和结束的具体时间点,找到对应Rawlevel的差值,即可计算出该测试场景的耗电量精确数据。
三、Android端耗电量测试
1、 Battery Historian耗电量消耗
(1) battery-historian服务搭建
①克隆安装包
git clone https://github.com/google/battery-historian.git
②下载battery-historian的代码和依赖
③修改setup.go文件的参数
值修改为:
因为版本不一样,编译会失败,所以升级到稳定版本。
④切换到setup.go所在的目录,进行编译
⑤启动battery-historian服务
go run cmd/battery-historian/battery-historian.go
如下所示:
⑥验证是否安装成功
http://localhost:9999/,出现如下,则ok!
(2) 耗电量数据收集
①清理耗电量数据
②运行测试用例/手工操作
使用monkey或appium来操作想要被测试的Android应用,最好就持续测试。
③收集数据
Android 7.0以上版本使用的命令 :
Android 6.0 或以下使用的命令:
如下所示:
(3) 上传测试数据,分析测试结果
各参数意义:
-
battery_level: 电量,可以看出电量的变化
-
plugged: 充电状态,这一栏显示是否进行了充电,以及充电的时间范围。
-
Screen: 屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息。
-
Top: 该栏显示当前时刻哪个app处于最上层,就是当前手机运行的app,用来判断某个app对手机电量的影响,这样也能判断出该app的耗电量信息。该栏记录了应用在某一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助。
-
wake_lock*: wake_lock该属性是记录wake_lock模块的工作时间。是否有停止的时候等。
-
running: 界面的状态,主要判断是否处于idle的状态。用来判断无操作状态下电量的消耗。
-
wake_lock_in: wake_lock有不同的组件,这个地方记录在某一个时刻,有哪些部件开始工作,以及工作的时间。
-
Gps: gps是否开启。
-
phone_in_call: 是否进行通话。
-
Sync: 是否跟后台同步。可以把鼠标停在某一项上面。可以看到何时sync同步启动的,持续时间Duration多久。电池容量不会显示单一行为消耗的具体电量,这里只能显示使用电池的频率和时长,你可以看分时段的剩余电量来了解具体消耗了多少电量。
-
Job: 后台的工作,比如服务service的运行。
-
data_conn: 数据连接方式的改变,上面的edge是说明采用的gprs的方式连接网络的。此数据可以看出手机是使用2g,3g,4g还是wifi进行数据交换的。这一栏可以看出不同的连接方式对电量使用的影响。
-
Status: 电池状态信息,有充电,放电,未充电,已充满,未知等不同状态。这一栏记录了电池状态的改变信息。
-
phone_signal_strength: 手机信号状态的改变。这一栏记录手机信号的强弱变化图,依次来判断手机信号对电量的影响。
-
Health: 电池健康状态的信息,这个信息一定程度上反映了这块电池使用了多长时间。这一栏记录电池状态在何时发生改变,上面的图中电池状态一直处于good状态。
-
Plug: 充电方式,usb或者插座,以及显示连接的时间。这一栏显示了不同的充电方式对电量使用的影响。
(4) 测试结果特性
优点:结果直观,有详细的耗电数据;
缺点:不支持5.0以下的android系统;
2、耗电量测试
①重启adb;
②使用adb devices查看手机是否连接上电脑;
③重置电池数据
④拔掉数据线,开始测试;
⑤测试完成后使用数据线连接电脑;
⑥收集电量数据;
⑦根据测试的包名找到对应的UID;
⑧根据uid查询电量消耗;