Android性能测试方法【硬核】

 本文围绕以下性能指标介绍测试Android端的测试方法:

  • 启动时间:启动APP所需时间
  • 流畅度:也称为帧率FPS,指画面每秒传输帧数;帧率越大,页面越流畅。
  • 过渡绘制:过度绘制描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。
  • 内存:占用系统内存的大小
  • CPU:对系统CPU的占用率
  • 流量:流量消耗

 

性能标准及Android如何获取数据

  1.CPU:

静态不超过5%,后台静默不超过1%,一般运行状态不超过30%,高负荷运行不超过75%,峰值不超过90%;

 

1.1 数据获取

  • 每隔1s获取对应app的cpu占用
  • adb shell top –d 1 | grep “包名”

     

 

 

  • adb shell dumpsys cpuinfo  | grep “包名”

 

秀秀app占用总cpu的0.8%,在用户(user)中花0.6%的时间,并在内核空间(kernel)花费0.1%的时间

1.2cpu检测的几种情况

  1. 空闲状态下的应用CPU消耗情况(程序运行后按home键挂后台)
  2. 中等规格状态下的应用CPU消耗情况(程序执行普通操作时的cpu占用)
  3. 中等规格状态下长时间的应用CPU消耗情况
  4. 满规格状态下的应用CPU消耗情况
  5. 针对性的场景测试

例如对软件使用较多的场景进行测试

 

 

2. 内存

  • 操作单次申请pss内存超过50M需查看是否合理,java堆内存单次操作申请内存不超过20M;
  • 不存在内存抖动问题,频繁GC;
  • 不存在内存持续增长问题,内存泄漏;
  • 不存在一段时间内存持续增长后无法释放问题,如位图未释放或重复缓存;
  • 返回mainActivity后不存在其他Activity实例;
  • hprof(内存快照),只可分析java层泄漏

 

2.1 数据获取

获取对应app的内存占用

adb shell dumpsys meminfo “包名”

 

2.2内存检测的几种情况

(1) 空闲状态下的应用内存消耗情况(程序运行后按home键挂后台)

(2) 中等规格状态下的应用内存消耗情况(注意查看是否申请的内存过大)

(3) 满规格状态下的应用内存消耗情况

(4) 针对性的场景测试

   较容易出现内存泄漏的部分场景:

  • activity间的切换,只要非静态的匿名类对象没有被回收,MainActivity就不会被回收,MainActivity所关联的资源和视图都不会被回收,发生比较严重的内存泄漏。
  • 连续查看和发送大图片,不断反复观看返回继续观看等操作,都有可能因为和之前的内存资源没释放而导致内存不断增长。
  • 有执行异步线程的场景后如果未给线程进行结束,会引起内存泄漏,因为activity的结束销毁不会把正在运行的thraead也结束回收掉。比如后台下载或加载东西时关闭activity。
  • 在activity关闭时Handler还没结束,会到导致内存泄漏。例如一些界面UI还在刷新时关闭activity。
  • 从登录界面登录账号后,登录界面的activity只是退到后台或是被登录后的activity覆盖,像这种过渡界面的acticity容易出现未去摧毁而出现内存泄漏。

 

 

对内存泄漏测试后期可预研使用LeakCanary,结合jenkins,定时取版本源码接入LeakCanary后执行monkey测试,查看是否能检查到内存泄露信息(此方法需要提供源码)。

 

 

2.3测试标准

测试场景中内存不会出现持续上升或短时间内出现内存抖动情况和无故申请过大内存的情况

 

3.启动时间(native)

  • 应用冷启动<=600ms为优秀,<=800ms为良好,<=1000ms为可接受;
  • 应用热启动<=200ms为优秀,<=400ms为良好,<=600ms为可接受;

 

3.1 数据获取:

  • 获取activity的方法:

1) 日志打印:获取运行中的activity,同时存在耗时的+279ms

adb logcat ActivityManager:I *:s 

 

2)获取当前页面的activity

adb shell dumpsys activity | grep mFocusedActivity
  • 通过adb shell am start -W –S –n <activity> 获取应用首次启动时间
  • 通过adb shell am start –W –n <activity> 获取应用二次启动时间

 

使用am命令获取的时间只是apk从onCreate到onResume的时间,但不包含UI界面呈现出来的时间,所以考虑计算从am命令执行到logcat中有displayed出现的时候, 视为app已经启动并展现,作为结束时间。后面对该方法验证是否可行。

 

3.2 App启动时间检测的几种情况

(1) 首次启动时间

(2) 非首次启动时间

 

3.3测试标准

首次启动时间<=600ms为优秀,<=800ms为良好,<=1000ms为可接受

二次启动时间<=200ms为优秀,<=400ms为良好,<=600ms为可接受

横向对比(与竞品对比)和纵向对比(与以往版本对比)

 

4.响应时间(native):

Activity切换时间<=100ms为优秀,<=200ms为良好,<=500ms为可接受;

 

4.1 数据获取

硬件:通过高速相机

软件:通过logcat日志的Displayed关键字

adb logcat >~/qiehuan.txt |grep Displayed

 

4.2Activity切换时间检测的几种情况

  1. 各主要场景页面的切换
  2. 关注一些一进入就需要进行加载的activity
  3. 针对性的场景测试

例如其他一些需要关注的页面切换等

 

4.3测试标准

Activity切换时间<=100ms为优秀,<=200ms为良好,<=500ms为可接受

横向对比(与竞品对比)和纵向对比(与以往版本对比)

 

 

 

5. 流畅度

  • 帧率<=50需优化,>=55为良好,>=57为优秀;
  • 不出现连续丢帧情况;

 

5.1 数据获取

1.手机开启开发者模式,开启“GPU呈现模式分析”,选择“在adb shell dumpsys gfxinfo中”

2.获取数据计算滑动帧率和掉帧数

adb shell dumpsys gfxinfo “包名” 

 

如上图信息表示了每一帧在安卓系统中的四个阶段:

Draw: 表示在Java中创建显示列表部分中,OnDraw()方法占用的时间

Prepare: 准备时间

Process: 表示渲染引擎执行显示列表所花的时间,view越多,时间就越长

Execute: 表示把一帧数据发送到屏幕上排版显示实际花费的时间,其实是实际显示帧数据的后台缓存区与前台缓冲区交换后并将前台缓冲区的内容显示到屏幕上的时间

将上面的四个时间加起来就是绘制一帧所需要的时间,如果超过了16.67就表示掉帧了

说明

Android定义了流畅度的数据标准,以60FPS为标准(FPS为每秒绘制的帧数),帧数过小就会出现卡顿感

每一帧在安卓系统中分4个阶段,4个阶段的总和超过16.67(1秒60帧,算下来平均1帧的间隔就约是16.67ms)就认为丢帧

这个定义在Android6.0以前是一定的,但是现在已经没有固定的标准了,因为目前安卓系统有3层缓存机制,加上硬件上的进步,即使超过16.67,也不一定会出现卡顿感。所以这个数据在测试时作为一种对比和相对衡量标准,也可根据需求自定义标准。


 

帧率计算方法如下:

DrawPrepareProcessExecutesum(计算和)帧率(1000/sum)
3.780.556.614.0214.9666.84491979
1.621.67.421525.6439.00156006
3.76

0.5

5.453.2112.9277.3993808
1.230.565.418.7115.9162.85355123
1.010.525.8910.117.5257.07762557
1.130.515.3811.3318.3554.49591281
1.351.056.88.2517.4557.30659026
2.290.546.169.1518.1455.12679162
1.190.556.159.9917.8855.92841163
1.510.526.0810.718.8153.16321106
1.422.166.592.4212.5979.42811755
2.560.616.232.7312.1382.44023083
1.590.556.532.5111.1889.44543828
1.10.516.371.619.59104.2752868
1.360.556.931.5210.3696.52509653
1.350.547.352.2411.4887.10801394
1.790.526.854.7113.8772.09805335
2.090.4913.394.2820.2549.38271605
1.050.247.337.9716.5960.27727547
1.870.255.1510.818.0755.34034311
6.641.135.594.6618.0255.49389567
1.330.266.121017.7156.46527386
0.690.246.1811.618.7153.44735436
1.030.534.610.6416.859.52380952
1.380.496.729.3817.9755.64830273
0.730.246.369.8617.1958.1733566
0.790.274.8511.6317.5457.01254276
1.910.54.0711.818.2854.70459519
0.770.57.149.6118.0255.49389567
0.720.483.7911.616.5960.27727547
1.050.519.677.2218.4554.20054201
0.740.253.8811.3416.2161.69031462
0.770.244.9711.4417.4257.40528129
1.040.274.8912.418.653.76344086
0.980.525.849.6116.9558.99705015
2.360.567.198.718.8153.16321106
1.180.569.235.4216.3961.01281269
3.140.546.957.7218.3554.49591281
1.460.537.0811.9421.0147.59638267
2.150.556.075.9514.7267.93478261
0.680.564.0712.6117.9255.80357143
2.160.565.8513.5722.1445.16711834
1.140.557.564.6813.9371.78750897
2.030.557.737.8918.254.94505495
2.350.518.857.9219.6350.94243505
1.840.247.776.9916.8459.3824228
0.740.53.7412.117.0858.54800937
0.630.234.8312.5718.2654.7645126
1.20.495.919.4617.0658.61664713
1.030.556.2212.7320.5348.70920604
1.070.536.028.3615.9862.57822278
1.650.496.348.5817.0658.61664713
2.310.6710.2720.1849.55401388
1.070.524.529.4815.5964.14368185
0.660.494.371.597.11140.6469761
1.520.58.392.6913.176.33587786
1.140.546.697.3415.7163.65372374
2.920.527.72.413.5473.85524372
1.80.566.119.0117.4857.20823799
0.990.573.6211.8116.9958.85815185
0.770.525.369.7416.3961.01281269
0.720.488.961.811.9683.61204013
0.670.453.752.417.28137.3626374
2.740.479.77.520.4148.9955904
0.670.476.223.6210.9891.07468124
0.610.485.398.0614.5468.77579092
3.150.556.041.8211.5686.50519031
1.730.485.621.59.33107.1811361
3.030.475.538.6717.756.49717514
3.660.56.555.0615.7763.4115409
3.120.576.82.7613.2575.47169811
2.250.547.276.4316.4960.64281383
1.920.517.454.0713.9571.68458781
2.740.587.35.0715.6963.73486297
3.020.595.673.1712.4580.32128514
1.990.555.574.4812.5979.42811755
1.820.296.444.0112.5679.61783439
5.540.598.723.1317.9855.61735261
2.490.266.0610.4319.2451.97505198
1.790.273.5811.417.0458.68544601
3.410.536.517.9118.3654.46623094
3.980.576.058.1518.7553.33333333
1.170.575.8910.7718.454.34782609
1.980.566.169.4418.1455.12679162
1.60.566.658.191758.82352941
1.190.565.4710.617.8256.11672278
33.250.827.112.5143.6922.88853285
0.930.588.657.1517.3157.7700751
48.143.5430.5311.9494.1510.62134891
5019.6411.472.0413.88117712
500.557.063.0260.6316.49348507
500.938.765.2264.9115.4059467
13.230.444.276.2624.241.32231405
11.210.957.228.3627.7436.04902668
8.730.447.863.8920.9247.80114723
34.820.5112.872.3450.5419.78630787
15.671.066.822.5326.0838.34355828
501.0112.8412.7376.5813.05823975
500.9312.6911.6675.2813.2837407
501.3212.532.566.3515.07159005
501.6730.0116.9698.6410.1378751
501.1910.2212.0173.4213.62026696
501.0910.292.964.2815.55693839
501.029.939.3170.2614.23284942
48.950.969.664.6764.2415.56662516
19.221.019.365.5635.1528.44950213
17.890.938.231.7828.8334.68609088
17.630.9547.1229.733.67003367
12.280.447.3713.0733.1630.15681544
6.761.017.839.4425.0439.93610224
11.70.923.9710.1226.7137.43916136
15.140.425.512.0923.1643.17789292
9.190.446.822.4418.8952.93806247
500.469.973.463.8315.66661444
12.51.136.542.3622.5344.38526409
18.80.987.442.6429.8633.48961822
7.880.97.32.7118.7953.21979776
4.760.967.587.8821.1847.21435316
4.890.947.173.0316.0362.38303182
501.17.262.6561.0116.39075561

 

 

5.2滑动帧率检测的几种情况

  1. ListView界面的帧率
  2. 可滑动界面帧率,如长的textview或可滑动的长图等
  3. 动画较多的页面操作帧率
  4. 针对性的场景测试

 

可能引起掉帧的原因:

1.手机性能差,CPU + GPU工作效率低下

2.横竖屏切换,需要用savedInstanceState保存的view信息进行重画

3.动画效果太多

4.GC太多

5.UI线程阻塞

6.界面试图结构过于复杂(可以通过Hierachy View查看)

7.过度绘制

 

注意:如果只掉了一帧,但是这帧所占时间较长,比如占了几个垂直同步信号的时间,虽然总体的FPS值还不错,但依然能肉眼感知到这帧的卡顿,所以这种情况也需注意。

 

5.3测试标准

应结合手机硬件性能决定性能标准,但建议最低也要大于50,60为最高值

横向对比(与竞品对比)和纵向对比(与以往版本对比)

 

 

6.过渡绘制(卡顿、慢)

 

 

6.1 数据获取

进入开发者模式>点击显示GPU过度绘制

 

6.2GPU过渡绘制检测的几种情况

各/主要页面

针对性的场景测试

 

6.3测试标准

  1. 不允许出现黑色像素
  2. 不允许存在4X过渡绘制
  3. 不允许存在面积超过屏幕1/4区域的3X过渡绘制
  4. 动态页面、可滑动/滚动列表,还可参考CPU的数据

一些静态页面,一般是无法修改的

 

横向对比(与竞品对比)和纵向对比(与以往版本对比)

 

7.流量

 

7.1数据获取

adb shell cat /proc/#pid#/net/dev

 

7.2流量检测的几种情况

(1) 应用首次启动流量

(2) 应用后台长时间运行后的流量值

(3) 针对性的场景测试

   例如发送接收图片,发送接收视频,刷新列表等操作

7.3测试标准

  • 不存在重复请求;
  • 页面静默时或处于后台不应有流量增加;
  • 缓存机制的逻辑合理;
  • 在移动网络下不应自动下载素材等数据;
  • 小缩略图小于5KB
  • 中缩略图小于25KB
  • 大缩略图小于50KB

 

 

 

欢迎交流点赞~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值