Android 性能测试
写在前面:
测试一道,博主接触的也是皮毛而已,没有接触过rom的测试,下边所说的都是博主接触过的app的性能测试。我只谈方法,少提概念。各位大神不喜勿喷。
概述
除启动时间外,我们应该做的测试,可能需要在几种状态下来验证app的性能情况。具体的业务形态也可能会更加的复杂,请根据具体的业务来决定需要做什么样的测试。
1、app空闲状态。
2、app正常使用状态。
3、app压力状态下(正常快速操作)的状态。
4、monkey(随机无须)操作状态下的性能情况。
1、启动时间
启动时间一般我们会测试三种情况。
·首次启动
·非首次启动
·activity 切换所消耗的时间
测试方法一般使用两种:
1)、程序内部打点到logcat,手动操作后获取log日志,来获取相应的时间。
2)、使用adb 命令来操作,在操作的前后分别记录消耗的时间。(由于adb 操作可能会有延时等可能,此方法并不是很准确)
ps. 还有一种方式是采用告诉摄像机的方式来做,由于本人没有接触过,不做过多说明,感兴趣的可以自己查一查怎么来做。
2、cpu和内存
1)、获取cpu数据
adb shell dumpsys cpuinfo | grep $package_name
输出格式为;
45% TOTAL: 18% user + 20% kernel + 6.2% iowait + 0.2% softirq
可取total得值作为整体cpu利用率。
2)、获取内存数据
adb shell dumpsys meminfo | grep $package_name 或者 adb shell dumpsys meminfo $package_name
直接dumpsys meminfo $package_name 可以看到比较完整的堆,线程,java等级别的内存数据,pss 可以作为内存的参考。
3)、使用top 同时获取cpu和内存,-d 参数指定采样数据的间隔时间。
adb shell top -d 2
输出:
PID PR CPU% S #THR VSS RSS PCY UID Name
名词解释:
- VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
- PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
- USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
可以看到,top 命令取出的内存对应是vss 和 rss,其中rss会比pss稍大,如果没有特别严格的要求,只是对比内存是否泄漏上涨等问题,rss也可以作为参考。
3、流量
1)、通过tcpdump抓包,然后wireshark 解包信息,来获取流量数据。
2)、通过adb 命令来获取,先获取应用的pid,然后通过/proc/uid_stat/uid/下的文件来读取流量值。此方式会有rom兼容性问题,并不是所有的文件都可以找到这两个文件。
adb shell dumpsys $package_name adb shell cat /proc/uid_stat/uid/tcp_rcv -- 下载流量 adb shell cat /proc/uid_stat/uid/tcp_snd -- 上传流量
由于tcp_rcv, tcp_snd 的值是一个累加的值,想要获取两次操作间消耗的流量,可以在操作前和操作后分别获取,差值即为期间消耗的流量。也可以每个一段时间做采样,来获取整个过程中的使用情况。
4、帧率
帧率一定程度上反应的是app在使用中的流畅程度,理想情况是每秒60帧。
1)、在开发者选项中有个“ GPU呈现模式分析(Profile GPU rendering,计算adb shell dumpsys gfxinfo中的呈现时间)”功能,在开启这个功能后,系统就会记录保留每个界面最后128帧图像绘制的相关时间信息。在开启这个功能后,重新启动APP,滑动页面然后执行adb命令。
adb shell dumpsys gfxinfo $package_name
输出结果中包含这部分数据
Draw Process Execute 1.30 1.25 0.53
0.63 0.62 1.64
0.24 0.51 0.44
0.25 1.76 0.40
0.25 1.55 0.43
0.25 0.53 0.37
0.49 1.51 2.12
Draw: 表示在Java中创建显示列表部分中,OnDraw()方法占用的时间。
Process:表示渲染引擎执行显示列表所花的时间,view越多,时间就越长。
Execute:表示把一帧数据发送到屏幕上排版显示实际花费的时间。其实是实际显示帧数据的后台缓存区与前台缓冲区交换后并将前台缓冲区的内容显示到屏幕上的时间。
Draw + Process + Execute = 完整显示一帧 ,这个时间要小于16ms才能保存每秒60帧。
2)、通过SurfaceFlinger, 这种方式还没有研究过,过段时间再来补充
adb shell dumpsys SurfaceFlinger
5、电量
对于电量的测试没有什么特别好的方式,可以选择使用物理设备来测试电池的电量情况。
对于android 5.0 以上的系统,adb命令可以支持获取电量信息。
adb shell dumpsys battery
输出内容如下:
AC powered: false USB powered: true Wireless powered: false status: 1 #电池状态:2:充电状态 ,其他数字为非充电状态 health: 2 present: true level: 55 #电量: 百分比 scale: 100 voltage: 3977 current now: -335232 temperature: 335 #电池状态 technology: Li-poly
如果是采用usb连接手机的话,(手机其实一直是处于充电的状态),这样测试出来的数据也不会很准确。
如果各位有什么好办法的话,大家可以一起探讨一下。