FPS和丢帧率可以一定程度上作为APP流畅度的一项衡量标准,利用adb shell dumpsys gfxinfo命令可以获取软件渲染加载过程的数据,进行计算从而获取结果

前置业务知识:

在此之前,需要先了解屏幕展示绘制过程及Android的VSync机制,可参考另一篇博客:
专项测试-流畅度测试之前的知识储备-Andorid中VSync机制的介绍

获取数据

  1. 运行命令"adb -s " + deviceName + " shell dumpsys gfxinfo " + packageName 获取基础数据,我们会获得很多数据,这里截取需要进行分析的部分:
注:如果运行完命令发现无上图中的4个参数,则很可能是手机的“GPU呈现模式分析”未打开;
在手机的开发者选项中,找到“GPU呈现模式分析”,选择“在adb shell dumpsys gfxinfo中”,如果是华为或荣耀的手机,则选择“在屏幕上显示为线型图”:

Android player 获取fps android显示fps_安卓系统


Android player 获取fps android显示fps_数据_02

  1. 如上图信息表示了每一帧在安卓系统中的四个阶段:
  • 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,也不一定会出现卡顿感。所以这个数据在测试时作为一种对比和相对衡量标准,也可根据需求自定义标准。

计算结果

通过以上数据,就可以获取到每一帧的时间、总帧数;从而就可以计算出jank数、vsync数,进而就可以得到最终的FPS和丢帧率数据;
手工计算无疑效率低,出错率大,所以这里的计算过程最好还是以脚本形式,让代码帮我们去计算,具体代码计算原理与过程可参考博客:

专项测试自动化-如何自动化获取APP的FPS、丢帧率等信息来测试流畅度(基于Android,Java)