【Android应用】性能测试方法

前言

Android设备的性能测试涉及面较广,且机型较多,所以Android设备的性能测试先天就是比较复杂的。此文力图以最简洁、最直接的方式阐述Android应用性能测试方法,同时也会涉及到一些性能测试标准。一方面是为有需要的童鞋做个参考,少踩些坑;另一方面也是为了共同进步,不断学习Android应用性能测试方法。 Android性能测试主要分为:帧率fps、静默CPU占用率、内存泄漏、流量、响应时间、过度渲染等,下文按照以上顺序进行展开(以手淘外卖为测试对象)。
ps:在进行具体测试之前,需要先配置好电脑环境,安装Android studio(最新版都是集成了Android sdk的)、java、MAT,具体怎么配置,请自行百度;打开手机USB调试,通过USB连接到电脑。 注:一定要确定手机能被正常检测到(cmd中输入:adb devices,应该能看到设备号)。


帧率fps

帧率fps测试标准:大于16ms帧占比<8%,流畅度>50(手淘有专门的换算公式)。 谈到帧率,这里有必要讲解下Android渲染机制,一图胜千言: Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,那么整个过程如果保证在16ms以内就能达到一个流畅的画面。那么如果操作超过了16ms就会发生下面的情况: 这到底什么意思呢?意思就是第三个VSYNC信号来的时候,要进行UI渲染了,结果发现对应于第二个VSYNC信号的UI渲染还没完成,这时第三个VSYNC信号只能等着下个16ms再进行响应的渲染了,这会发生什么呢?掉帧呗,或者叫丢帧,如果这种情况发生的太多,用户就会感觉到app卡顿了。
有童鞋肯定纳闷为什么是16ms?那么我网上查了下,原因如下:
    1.现在手机一般刷新频率都是60HZ,那么1000/60≈16.67,所以必须在16ms内完成一帧的任务;
    2.1000/16=62.5(Hz/fps),而人眼与大脑之间的协作无法感知超过60fps的画面更新。12fps大概类似手动快速翻动书籍的帧率,这明显是可以感知到不够顺滑的。24fps使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的 效果。24fps是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。但是低于30fps是
无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,当然超过60fps是没有必要的(据说Dart能够带来120fps的体验)。 那么,怎么测量帧率呢? 【方法一】 1.下载本文附件中的工具包; 2.在Android手机设置里打开GPU呈现模式分析->在adb shell dumpsys gfxinfo中:以MX4手机为例:设置->辅助功能->开发者选项->GPU呈现模式分析->在adb shell dumpsys gfxinfo中; 3.打开步骤1中下载的工具包:android_perfTool->perftest.jar,双击或在命令行中输入:java -jar perftest.jar(具体以该工具所在路径为准),此时就能在工具中进行检测了。该工具最下方给出了具体的信息,较为方便。
【方法二】 1.在Android手机设置里打开GPU呈现模式分析->在adb shell dumpsys gfxinfo中:以MX4手机为例:设置->辅助功能->开发者选项->GPU呈现模式分析->在adb shell dumpsys gfxinfo中; 2.打开需要测试的APP,如果已经打开,请关闭后,重启该应用; 3.打开命令行(cmd),在命令行输入:adb shell dumpsys gfxinfo "你自己的应用名字" > fps.txt; 4.打开生成的fps.txt,找到Profile data in ms这部分数据,即是我们需要的数据。 5.当然,你要是觉得txt中查看不方便,可以将这部分数据复制到excel中,做一个图表出来,很直观。 【方法三】:Android手机设置->GPU呈现模式分析->在屏幕上显示为条形图:以MX4手机为例:设置->辅助功能->开发者选项->GPU呈现模式分析->在屏幕上显示为条形图,这样就能直观的观察帧率情况了。

静默CPU占有率

性能测试标注:<=1%(至少保证静默测试60分钟);
【方法一】
1.下载本文附件中的工具包;
2.打开步骤1中下载的工具包:android_perfTool->perftest.jar,双击或在命令行中输入:java -jar perftest.jar(具体以该工具所在路径为准),此时就能在工具中进行CPU占用率的检测了。
注:如果工具不能正常测得数据,请采用【方法二】。 【方法二】打开命令行,输入:adb shell "top|grep 'com.taobao.taobao'",一定注意,要带双引号,这是个坑!这时需要的数据就来了。
ps:图中数据不是静默的哈,只是方便展示而已~

内存泄漏

性能测试标准:不存在内存泄漏。
手淘中植入了开源的内存检测代码,该检测基本上能够监控到任何内存泄漏,并给出友好的界面提示。当然,这不是百分百的,我们还是需要进一步测试,测试方法如下:
【方法一】通过检测内存占用量来判断是否发生了内存泄漏:内存占用量应该在一个有限的范围内变化,如果波动较大,就存在内存泄漏,具体步骤如下:
一种方法是:
    1.下载本文附件中的工具包;
    2.打开步骤1中下载的工具包:android_perfTool->perftest.jar,双击或在命令行中输入:java -jar perftest.jar(具体以该工具所在路径为准),此时就能在工具中进行内存占用量的检测了。
另一种方法是:打开Android Studio,在主界面下方【monitor】也有性能检测需要的各种信息,只是该信息不方便导出。
【方法二】
1.打开Android->Sdk->tools->monitor(或者ddms),左侧Devices中必须显示待测设备,即图中标注1所示。

2.选中需要测试的APP进程,手淘进程是“com.taobao.taobao”(图中是system_process),即图中标注1所示。在手机上反复进出外卖首页3~5次,然后点击“Update Heap”(图中标注2所示),等待20s后,点击一次“Cause GC”,观察“data object”中的“Total Size”值,然后反复进出外卖首页,观察“data object”中的“Total Size”值(该值大小即是手淘此时占用手机的内存总量,应该稳定在一个有限的范围,可以作为内存泄漏的一个判断指标)。
3.点击“Dump HPROF file”按钮,即图中标注5所示,导出hprof文件,名称是"com.taobao.taobao",该名称一般都是以进程名称命名。
4.打开命令行(cmd),将路径切换到“...\Android\Sdk\platform-tools”,什么?不会切换,那么请自行百度! 然后输入命令:“hprof-conv com.taobao.taobao.hprof aaa.hprof”,其中,“com.taobao.taobao.hprof”文件注意路径,可以直接拖拽到命令行(cmd),“aaa.hprof” 即是需要的文件,执行完之后,该文件在“...\Android\Sdk\platform-tools”路径下;
5.打开MAT,File->Open file,选中步骤4中的“aaa.hprof”文件,之后一路点next、finish...最终出现下图所示界面,注意图中标注1:

6.点击上图中标注2所示,得到下图所示界面,在下图中标注为1的地方输入要查询的类,本文需要定位的类为“TakeoutMainActivity”,即可检测到外卖主界面是否仅持有一个单例,或者是否正常释放,至此,【方法二】检测内存泄漏即算完成。


注:步骤2中“Cause GC”点击一次之后,每隔一段时间,软件会自动执行一次GC,因此不必手动点击;步骤3中导出文件过程比较慢,请耐心等待。另外,图中的system_process别乱GC,GC完我手机都挂了,怎么都开不开,后来系统好像是重新更新了一样。。。

流量

性能测试标准:控制资源个数和资源大小(<50KB),无重复请求,静默时尽量无使用,h5页面控制在200KB大小。
【方法一】
    1.下载本文附件中的工具包;
    2.打开步骤1中下载的工具包:android_perfTool->perftest.jar,双击或在命令行中输入:java -jar perftest.jar(具体以该工具所在路径为准),此时就能在工具中进行流量的检测了。
【方法二】:打开Android Studio,在主界面下方【monitor】处也有性能检测需要的各种信息,只是该信息不方便导出(内存泄露中已附图,此处省略)。
【方法三】
1.打开Android->Sdk->tools->monitor(或者DDMS),左侧Devices中必须显示待测手机设备。

2.在上图中下方栏中即可检测到流量数据;
3.接口数量是否重复请求,可以通过无线实验室进行,具体步骤详见 无线实验室帮助文档,其中可以查看接口请求,以及请求资源大小等信息。

响应时间

性能测试标准:wifi/4G/3G<1s,2G<2s。
【方法一】:perftest工具-》导出数据-》打开导出文件,其中launch time即是响应时间,找到需要检测的Activity即可。
【方法二】:利用 魔兔平台检测埋点数据(Activity)。
【方法三】:打开命令行(cmd),输入 adb logcat -s ActivityManager |grep "Displayed"。

过度渲染

性能测试标准:wifi/4G/3G<1s,2G<2s。
【方法】:Android手机设置->调试GPU过度绘制->手机上显示的不同颜色就标识层数:以MX4手机为例:设置->辅助功能->开发者选项->调试GPU过度绘制->手机上显示的不同颜色就标识层数,这样就能直观的观察页面哪些地方层数比较深,便于改进。

总结:

本文是自己做Android手淘外卖性能测试的一点小小的总结,中间难免会有差错,希望各位能多多指正,共同学习。
注:附件包就不附上了,如果需要,联系我就好~

【参考】

帧率: http://baike.baidu.com/link?url=AMITuD1P16sYQl4mtZLDqA8QlFnH80oQBkYGhIML2GngIFfcFmYqpV_KmheA2M1-Jx9V4LB1HnxDyz-0tv8ECq 如何测量Android应用的帧率FPS: http://jingyan.baidu.com/article/ac6a9a5e7e5f352b653eacfa.html
Android内存泄露分析(MemoryAnalyzer工具):http://blog.csdn.net/pugongying1988/article/details/9122699

更多相关文章

  1. 自定义控件之View原理与使用
  2. android基础知识12:android自动化测试06—Instrumentation 03 技
  3. Android(安卓)Handler机制剖析
  4. 【Android开机启动Activity或者Service方法】
  5. Android跨进程通信之非AIDL(二)
  6. 《Android/OPhone开发完全讲义》连载(5):Notification与状态栏信息
  7. Android流式布局实现
  8. android调用第三方软件打开下载的附件
  9. Android(安卓)开发中使用 SQLite 数据库

随机推荐

  1. go语言有什么优点?
  2. go语言 list用法是什么
  3. go语言中make和new的区别是什么?
  4. 编程语言go是什么
  5. go语言中数组和切片的区别是什么?
  6. go语言适合做哪些开发
  7. win7 go语言如何安装
  8. 关于Golang连接池的几种实现案例
  9. go语言实现string转float的方法
  10. 详解Go 中方法与函数的区别