android获取某应用的帧数据:

  • 前提操作:

(打开手机 开发者选项-GPU显示配置文件(显示于 adb shell dumpsys gfxinfo)勾上,只有4.1以上支持)

在android4.1中,谷歌提供了一个工具来,叫做“ GPU呈现模式分析(Profile GPU rendering)”,

在开启这个功能后,系统就会记录保留操作界面最后128帧图像绘制的相关时间信息


  • 正式开始开始操作
  1. 打开需要测试的页面,上下匀速的滑动(这里建议最好是用脚本稳定运行)
  2. 命令行 adb shell dumpsys gfxinfo com.taobao.mobile.dipei
  3. 结果中 Profile data in ms 

分析下面数据(这里要注意,找到对应的页面activity对应的数据)

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

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

Execute:表示把一帧数据发送到屏幕上排版显示实际花费的时间。


其实是实际显示帧数据的后台缓存区与前台缓冲区交换后并将前台缓冲区的内容显示到屏幕上的时间。所以这个时间,一般都很短。

PS:View类包含Surface(变量名mSurface),每个Surface通常对应两个buffer,一个front buffer, 一个back buffer。

 (4.1之后是3个,一个前,两个后)其中,back buffer就是canvas绘图时对应的bitmap (研究Android_view_Surface.cpp::lockCanvas)。

 因此,绘画总是在back buffer上,需要更新时,则将back buffer和front buffer互换。   

 Draw + Process + Execute = 完整显示一帧 ,

 这个时间要小于16ms才能保存每秒60帧。

将数据复制到excel中(win记得逐列复制,mac下就直接复制过去吧),然后将数据生成“堆积柱形图”;


  • 统计数据
  1. 将上面步骤中得到的三列数据,放到excl里面,将3个值加在一起得到一帧的总耗时sum1,sum2,....sum128,共128个帧值;
  2. 将这128个帧中大于16ms的数据count()出来,比如,得到10帧是大于16ms的;
  3. 再将10/128 与8%比较,超过8%则可以断定基本不合格;小于8%可以算合格;

这里面的3个步骤,均可以用脚本来实现,后续会补上特定的章节来描述如何用脚本来实现;


https://blog.51cto.com/lilier/1559740