本文由做者张迎贞受权网易云社区发布。html
APP性能测试除了须要监控PCU、内存占用、流量等,还须要获取APP的电量数据,测试在可接受范围内,避免APP出现过分消耗电量的现象。
手机有不少硬件模块:CPU,蓝牙,GPS,显示屏,Wifi,射频(Cellular Radio)等,在手机使用过程当中,这些硬件模块可能处于不一样的状态,譬如WIFI打开或关闭,屏幕是亮仍是暗,CPU运行或休眠。 硬件模块在不一样的状态下的耗电量是不一样的。Android在进行电量统计时,并非采用直接记录电流消耗量的方式,而是跟踪硬件模块在不一样状态下的使用时间,收集一些可用信息,用来近似的计算出电池消耗量。
从用户使用层面来看,Android须要统计出应用程序的耗电量。应用程序的耗电量由不少部分组成,可能使用了GPS,蓝牙等模块,可能应用程序要求长时间亮屏(譬如游戏、视频类应用)。 一个应用程序的电量统计,能够采用累计应用程序使用全部硬件模块时间这种方式近似计算出来。
举一个例子,假定某个APP使用了GPS,使用时间用 python
测试方法多种多样:android
一、CPU空闲时,停留在主界面不退出,打开网络而后锁屏,12小时后查看电量、流量变化
二、APP在操做运行时(此过程可借助使用monkey进行压力测试),1小时后查看电量、流量变化
三、第三方APP进行步骤一、2相同的场景测试
四、对比竞品APP的耗电量。
指望结果:APP在静止状态时无没有明显的耗电状况,在运行状态时耗电量在可接受范围内。git
有的手机设置菜单里面会有流量和电量统计类,只需在测试先后记录下电量值,即可获取消耗电量数值。github
已知公式 : 耗电量 = 电流 * 时间
例:平均电流为150mA,测试时间30min,则,30min内耗电量为:150 * 30 /60=75mAh(毫安小时)。
经过耗电量和使用手机电量的百分比,可得出手机电池容量(理论值)。
一个系统走一遍基础功能耗电不该超过20%。sql
一、Emmageeshell
Emmagee是网易杭州研究院QA团队开发的一个简单易上手的Android性能监测小工具,主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流等性能状态的变化,且用户可自定义配置监控的频率以及性能的实时显示,并最终生成一份性能统计文件。json
二、腾讯GT浏览器
此apk是一款能够对APP进行测试的软件,能够在任何状况下快速测试手机app的CPU、内存、流量、电量、帧率/流畅度等性能测试。
使用方法:
打开GT,点击选择被测应用,选中本身要测的app,选择关注的测试点,cup、net(流量)、内存(pss)等,点击“启动”,在gt的插件标签里有耗电测试,导出文件查看电量使用。
三、其余各类常见耗电量监控工具
金山电池医生:可以记录CPU耗时、流量消耗随时间的变化曲线,这样能够查看app耗电在哪些时间点.
GSam Battery Pro:耗电量信息显示详细,包括了唤醒锁数,先后台占用cpu的时间,能够导出数据,支持多种监控起始时间点设置
PowerTutor:1.显示系统电量消耗水平,记录耗电量的焦耳值,不是百分比,包括LCD/OLED,CPU,WiFi,3G,GPS和Audio;2.查看某段时间内全部运行中的应用程序的耗电量
Battery Monitor Widget:高度可定制化的电量监控小工具,不只能够显示当前电量,估算剩余电量支撑时间,还能够一目了然地检测出各个APP的耗电历史,从而方便进行比较。
Smart Battery Monitor:除了能够在状态栏显示电池消耗百分比外,还能够显示电池的温度,以及已充电时间。
Battery Indicator:亮点是轻便、小巧,甚至使用它时不会消耗电池。固然,它能够显示电池的电量百分比、电池的温度、以及电池的健康信息。
Battery Widget:这个工具不只是一个电池Widget,还能够做为显示选项,GPS,WiFi,蓝牙选项等的快捷方式。
Battery Saver:被称为管理电池的最强大应用之一。除了显示电量信息,电池温度和健康信息外,它还能够快速管理一些耗电量大的应用如:GPS,WiFi,蓝牙等。另外:该工具能够查看一天以内的哪一个时间点电池的耗电量最大。|
等等等等
Android框架层经过一个名为batterystats的系统服务,电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。电池的这些信息是BatteryService经过广播主动把数据传送给所关心的应用程序。实现了电量统计的功能,batterystats实现原理能够查阅电量统计服务
Android提供的dumpsys命令用于查看系统服务的信息(实现原理能够查阅dumpsys介绍), 将batterystats做为参数,就能输出完整的电量统计信息。
执行:
手机链接usb执行:
adb shell dumpsys batterystats --enable full-wake-history
adb shell dumpsys batterystats –reset //清空电池的历史状态复制代码
断开USB,打开目标应用,执行monkey,正常使用5分钟左右。
链接USB,执行:
adb bugreport > bugreport.txt
也能够用adb shell dumpsys batterystats > com.nt.topline > toplinepower1.txt //获得指定app相关的电量消耗信息。
python historian.py -a bugreport.txt > batterystats.html复制代码
上面的historian.py脚本是python写的,因此须要python环境,从github上下载这个脚本。Chrome浏览器打开生成的battery.html文件,打开查看。
html中信息都能从bugreport.txt中找到相应的信息。
分析各个指标表明的意义:
上面的10,20表明的就是秒的意思,它是以一分钟为周期,到第60秒的时候变为0。横坐标就是一个时间范围,我们的例子中统计的数据是以重置为起点,获取bugreport内容时刻为终点。咱们一共采集了多长时间的数据,图表下也有信息说明。(经其余人的反馈,这个坐标间隔是会随着时间的长度发生改变,因此要以你的实际状况为准)
battery_level:电量,能够看出电量的变化。好比上图中的数据显示刚开始电量是100%,而后在第11秒-12秒中间的某个时刻降到了99%。
经过前面学习到的Battery Historian咱们能够获得设备的电量消耗数据.
例如拿移动网络举例,若是数据中的移动蜂窝网络(Mobile Radio)电量消耗呈现下面的状况,间隔很小,又频繁断断续续的出现,说明电量消耗性能很很差:
通过优化以后,若是呈现下面的图示,说明电量消耗的性能是良好的:
另外WiFi链接下,网络传输的电量消耗要比移动网络少不少,应该尽可能减小移动网络下的数据传输,多在WiFi环境下传输数据。
主要形成耗电的几大缘由:
屏幕唤醒
CPU唤醒
蜂窝数据
传感器
网络请求耗电,并且手机数据网络进行http请求比无线网进行http请求更加耗电,由于数据网络调用到一些底层的硬件模块,就如GPS同样,当手机打开GPS功能后,也是启动了一些硬件模块就会明显增长耗电
高频的刷新UI界面,刷新UI界面其实就是进行layout的绘制,若是一个Activity的布局嵌套太多层,那么每一层layout都会刷新一次,例如动画等等这些都会形成耗电
数据库,SD卡文件操做,这些都是属于耗时操做,当操做次数不多的时候基本不会有耗电问题,可是当短期内操做次数不少的话,也会明显的增长耗电,同时也有可能形成页面卡顿
AlarmManager,例如一些推送的心跳包实现,AlarmManager会定时唤醒CPU去执行一些任务,也是形成耗电的一大源头
手机网络环境很差的时候会频繁的切换网络,由于网络数据交互的时候,系统也是会被唤醒的,因此APP若是在监听了网络切换广播后作了大量的操做,同样会增长耗电
针对一些任务队列的处理,若是队列堆积的任务太多,致使循环执行过久也会形成耗电,由于占用了CPU资源去执行代码,咱们的log日志工具保存到文件就是用任务队列实现的,当压力测试SDK一次性接受1万条消息的时候,那内存就表上来了,跟了下发现日志保存队列里面积压了4千多个任务,这时候即便手机锁屏,也还会不断的把队列中的任务执行完而后CPU才会休眠下去的,一样会形成严重的耗电,耗内存,好在release版本的日志都是关闭的
执行一些高运算量的代码,例如json数据解析,一些二进制协议的数据编码和解码
接收系统的一分钟广播,而后作一些程序逻辑处理,其实接收一分钟广播不耗电,耗电的是一分钟执行一次程序处理
Wake Lock使用不当致使没有及时的释放,Wake Lock能够阻止cpu进入休眠的,若是没有及时的release会形成cpu没法休眠,程序耗电严重
若是程序中有定时任务,在cpu休眠以后,定时任务就会被挂起不执行,这时候并不会形成太大的耗电,可是若是这个定时任务的时间间隔很短,1秒执行一次,那么当手机app集成了推送,推送就会有心跳包经过AlarmManager来唤醒,每次唤醒的时候就会再去执行挂起的定时任务,虽然执行定时任务的耗电量可能比心跳包的耗电量少不少,不过仍是须要注意的,聚沙成塔
其实android中的Log日志的打印也会耗电的,在平常开发中,咱们可能不只会把log打印到AndroidStudio里面,有可能还会保存起来,并且可能在打印对象信息数据的时候会用到json格式转换,这些都会增长耗电,可是在正式发布的apk包中日志管理通常都是关闭的
在手机锁屏后,CPU会过一段时间才休眠,若是程序中有定时任务,在CPU休眠后会被挂起不执行,可是在CPU休眠以前,定时任务仍是会一直的执行的,以前遇到过这么一个问题,咱们采用Picasso库:Picasso.with(context)
o 传感器的使用,好比gps,若是业务上非频繁使用而且要求精度不高,那么就在业务上优化定位时机和精度.
o 若是业务上须要有长时间的service,那么要考虑到CPU weak lock,防止后台任务没有完成,可是cpu睡眠,或者任务已经完成,仍然持有weak lock
o 咱们也许会在手机充电时,作一些日志上传操做的定时任务,那么注意重试次数和成功后处理,防止用户一晚上充电不到80%,而后手机厂商为咱们背锅的状况
o 已知屏幕唤醒是耗电大户,缘由是屏幕渲染,绘制消耗资源,因此咱们在自定义视图,布局的时候,要尽可能作到Android性能优化里要求
o 同理,各类优化,平时编码的习惯,都会影响咱们脆弱的电量
o 为了减小电量的消耗,在蜂窝移动网络下,最好作到批量执行网络请求,尽可能避免频繁的间隔网络请求。
针对Http请求优化:
o 对http请求数据作GZIP压缩,当前流行的http第三方看默认都支持GZIP压缩
o Http缓存,Http协议有一个Cache机制,当发出http请求的时候会先到指定目录下检查是否已经存在这个请求的数据,若是存在而且还没过期,那么就会直接返回;而一些第三方例如OkHttp也有有本身的缓存 机制OKHTTP缓存
o 合并Http请求来减小Http请求次数,由于Http底层也是TCP链接,对于每一个Http请求,发出请求的时候都会建立TCP链接,请求结束后会断开TCP链接,那么当Http请求次数不少的时候就会频繁的建立和断开TCP链接,若是把当中一些请求进行合理的合并,那么就会减小Http请求次数
o 制定合理的Http请求数据格式和返回数据格式,作到请求数据中没有冗余字
o 能够在Http请求数据格式里面加一个字段dataVersion表明本地已有数据的版本号,而后传到服务器,服务器的数据表中也有一个字段是dataVersion,当服务器数据被修改的时候,dataVersion就加一,当检测到客户端传上来的dataVersion小于服务器数据表中的dataVersion的时候就返回最新数据,不然能够直接返回空数据表明当前本地数据已是最新数据,这样就不会每次请求http的时候都会返回大量数据,当数据没有被改变的时候直接返回空,减小了http请求过程当中的数据交互(可是要考虑一点,只有一些请求数据量比较大的才适合,由于增长了dataVersion字段后不管给客户端仍是服务端也都相应的增长了维护的成本)
o APP在对数据库或者SD卡文件操做的时候无非也是涉及到一些数据的转换,json转换,能够采用json解析效率高的第三方库,例如fast json,Jackson,gson
o 能够把一些须要持久化到数据库或者文件中的数据先缓存在内存中,而后在一个时间点一块儿触发一同更新到数据库或者文件中;例如,在进入Activity的时候会首先从数据库中搜索出账户信息而且展现在界面,而后会再去发Http请求服务器的账户信息数据,再把服务器最新的账户信息数据刷新到界面中,同时也存在一个内存对象中,这时候先不更新到数据库,当退出这个Activity界面的时候能够去检测账户数据是否发生改变,若是改变了就更新到数据中;这么作的好处是:若是在Activity界面屡次修改数据,那最新的数据都是只更新到内存中的,当Activity退出后才把最新的账户信息数据更新到数据库中,不必更改一次就同时把数据更新一次到数据库
o SD卡的文件读写操做比数据库要快,数据库也是属于文件,可是在写数据的时候还要通过sqlite的一些列数据库操做,可是SD卡在写数据的时候是直接写到文件中的,因此针对与简单数据,标志变量或者数据条数不多的数据,并且安全性要求也不高的数据能够直接存在文件中,例如SharedPreferences中,只有关系型的数据,数据安全性较高的,数据记录条数比较多的能够选择数据库存储,并且若是数据库进行加密后,对于数据库的读写操做会更慢了
o 针对数据库操做尽可能不要直接使用android里面的Sqlite来手写读写的那些sql语句,能够选择一些orm框架库,例如ormlite,GreenDao等等,咱们选择的是ormlite,由于ormlite数据库加密已经有现成的库能够提供使用。
以上!感谢!分析不够全面的部分欢迎交流补充!
参考:
http://blog.csdn.net/itfootball/article/details/44084159
http://blog.csdn.net/itfootball/article/details/49004699
http://news.mydrivers.com/1/282/282933.htm
https://github.com/google/battery-historian
http://hukai.me/android-performance-battery/
https://juejin.im/entry/589d66c686b599006b2e07a8
http://xusx1024.com/2018/01/08/battery-historian-2/
http://gityuan.com/2016/01/10/power_rank/
http://hukai.me/android-performance-patterns/
http://duanqz.github.io/2015-07-21-batterystats-part1
http://duanqz.github.io/2015-07-19-Intro-to-dumpsys
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 hadoop中的序列化