一、如何收集FPS数据

1.使用adb命令获取

首先需要开启“开发者模式->UI呈现模式分析→在adb shell dumpsys gfxinfo中”,然后使用该命令即可获取最新128帧的绘制信息。

这里以知乎为例,简单看下其输出数据。

udid=adb devices | sed -n 2p | awk '{print $1}'
packageName="com.zhihu.android"
fps_info=adb -s ${udid} shell dumpsys gfxinfo ${packageName}
echo ${fps_info} > fps.txt

file
Draw:是消耗在构建java显示列表DisplayList的时间。说白了就是执行每一个View的onDraw方法,创建或者更新每一个View的DisplayList对象的时间。

Process:表示是消耗在Android的2D渲染器执行显示列表的时间,view越多,要执行的绘图命令就越多,时间就越长。

Execute:消耗在排列每个发送过来的帧的顺序的时间,或者说是CPU告诉GPU渲染一帧的时间,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复。所以这个时间,一般都很短。

Draw + Prepare + Process + Execute = 完整显示一帧,这个时间要小于16ms才能保存每秒60帧。

此方法只是粗略看一下近128帧的绘制信息,有个直观的印象,不做过多实验。

2.使用PerfDog获取

官网:https://perfdog.qq.com/

使用文档:https://bbs.perfdog.qq.com/article-detail.html?id=5

初步体验了一下,收集的数据很全面,包括FPS / Frame Time / CPU / Memory / Network等信息,使用非常简单方便,即插即用。

逛了下知乎,简单收集了4分钟左右的数据,结束时可以将数据上传至云端以便查看。

file
详细内容可以戳此链接查看,https://perfdog.qq.com/case_detail/465280 Password: fe8fOw

那么问题来了,测试时如果靠测试同学手动去使用APP,收集统计信息,无疑是非常麻烦且耗时的,需要一个自动化的方法来使用APP,解放双手,同时使用PerfDog收集性能数据。

二、自动遍历APP

1.使用Android原生自带的monkey工具

使用文档:https://developer.android.com/studio/test/monkey

file
使用命令adb shell monkey -p com.zhihu.android -v 5000简单看一下情况。

file

-p选项:如果您通过这种方式指定一个或多个软件包,Monkey 将仅允许系统访问这些软件包内的 Activity。如果应用需要访问其他软件包中的 Activity(例如选择联系人),

您还需要指定这些软件包。 如果您未指定任何软件包,Monkey 将允许系统启动所有软件包中的 Activity。要指定多个软件包,请多次使用 -p 选项 – 每个软件包对应一个 -p 选项。

感觉这命令有bug呀,指定了软件包以后,还是会有很多系统应用的事件出来。

2.使用UICrawler

GitHub:https://github.com/lgxqf/UICrawler

使用命令java -jar UICrawler-2.3.jar -f config-zhihu.yml -u 14375200简单测试一下。

输出的日志信息如图,基于Appium实现,主要功能是找到页面上的所有元素,然后遍历点击。

file
file
遍历速度太慢了,感觉大部分时间都在找元素,然后判断,算坐标,触发点击事件。从收集的数据中也能看出大部分时间页面处于静止状态,无法统计有效的FPS信息。

需要进一步深入了解此框架能否加速遍历。

3.使用AppCrawler

GitHub:https://github.com/seveniruby/AppCrawler

使用命令java -jar appcrawler.jar --capability "appPackage=com.zhihu.android,appActivity=.app.ui.activity.LauncherActivity"简单测试一下。

输出的日志信息如图,此框架同样是基于Appium实现,思路和上一个框架一致。

file
file
可以看到遍历速度比上一个稍快,但是实际上速度还是很慢,中间有一段长时间的60FPS数据是因为点进了知乎直播的功能。

4.使用Maxim

GitHub:https://github.com/zhangzhao4444/Maxim

此框架是基于uiautomator实现的,速度上会比基于Appium实现的框架更快,作者描述为“高速uiautomator控件解析算法的Android Monkey, 每秒10-15个Action Event。实现快速DFS算法的Android Monkey , 每秒 5个Action Event。”

在使用之前,需要先将两个jar包push到手机中。

adb push framework.jar /sdcard
adb push monkey.jar /sdcard

使用命令adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.zhihu.android --uiautomatormix --running-minutes 60 -v -v简单测试一下。

输出的日志信息如图

file
file
file
从上图中,可以看出Maxim的遍历速度确实比前者快,统计的FPS数据也更为有效。

三、总结

对比以上方案,目前可以得出的结论为使用Maxim进行APP的自动遍历,速度更快,统计到的有效FPS数据也较多,同时使用PerfDog收集性能数据进行分析。

存在的问题:

自动遍历的方案,具体遍历到了哪些地方无法衡量,且速度的快慢对于收集的FPS数据影响较大。
无法完全模拟人为的使用习惯,来客观反映APP的真实性能情况。
在自动遍历的过程中如果APP发生了crash,PerfDog会中断收集数据,随后自动遍历程序会接着启动APP继续进行遍历,但是PerfDog不会继续收集。

分类: 测试

发表评论

电子邮件地址不会被公开。