如何更快速有效的收集Android应用的FPS?
FPS是什么?
FPS(每秒传输帧数(Frames Per Second))是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数,对应的就是APP UI界面的刷行频率,在一个UI动画的播放过程中,fps越大,界面表现越流畅,fps越低,界面表现越卡顿,因此,测量FPS经常用于评价一个APP的流畅度,以此来判定APP是否能带来更好的用户体验。
我们是如何收集APP帧率的?
通常情况下,我们可以通过以下三种方式收集到APP的fps:
1、设备连接usb数据线,使用adb调试工具,输入命令:adb shell dumpsys gfxinfo <pagekagename>,随后对返回的数据进行适当处理便可以得到此时此刻app的fps。这种方式是最普遍也是最常用的一种,但在使用上有明显的痛点,一是设备需要连接usb,二是adb命令返回的数据并不是实时fps,需要经过处理才能得到,因此不能在测试app的过程中实时显示fps,或许你可以写一个简单的脚本运行在pc端,在pc端显示fps,但对测试人员来说,一边看手机,一边看电脑的体验并不好。
2、通过在root的设备上安装第三方性能测试工具app,目前业界存在许多类似腾讯gt的性能测试工具app,安装这个app到设备后,便可以在测试app的过程中监控到被测app的所有性能数据,包括fps,一般也会有悬浮窗将性能数据实时显示在界面上,方便测试人员测试,但有个大前提:获取fps数据,设备必须root;
3、修改被测app源代码,通过Choreographer的回调FrameCallback来计算Loop被运行了几次,从而计算出应用的流畅度。这种方式得出的fps可能是最精确的,但是成本也是最大的。
无需数据线、无需root、无需更改被测APP源码,更快速有效的收集APP 帧率
能否不需要usb、不需要root、不需要更改app源代码就能获取到app的fps呢?答案是肯定的,技术实现的关键点就是,开发一个app,利用无线adb调试,在app上模拟adb发送dumpsys命令获取到并计算设备fps。
首先,我们需要开启设备的adb命令端口,使用adb命令:adb tcpip 5555,表示设备的5555端口用于接收adb命令而不需要通过usb数据线。
随后,在我们的app端,通过:adb connect 127.0.0.1:5555连接到设备,连接成功后,我们可以构造socket,模拟shell命令“dumpsys gfxinfo“发送到5555这个端口。
最后,接收5555端口的响应数据并对数据进行处理计算,便可以得到fps,并把fps通过悬浮窗显示在app。
这样,便改进了我们平时在收集fps过程中遇到的痛点和影响效率的地方,让fps变得唾手可及。