Python解析systrace获取APP快速滑动界面的帧率

Posted 软件测试小dao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python解析systrace获取APP快速滑动界面的帧率相关的知识,希望对你有一定的参考价值。

关注我,每天分享软件测试技术干货、面试经验,想要领取测试资料、进入软件测试学习交流群的可以直接加群644956177~~

本文不讲解怎么抓取systrace,也不会讲解chrome浏览器操作systrace的快捷键方法,主要讲解手工怎么查看每帧的耗时,以及systrace解析每帧的原理。文末提供Python解析脚本,原理说明文档,测试systrace文件。

一、systrce文件的查看(具体的例子)1、打开systrace文件,只能使用chrome浏览器,在地址栏输入chrome://tracing/,然后点击Load加载文件:在这里插入图片描述
2、加载完成后在界面按g/G键,然后按v键,出现的界面如下图,图示是点击了g和v以后的效果,其中红色的竖线是点击了g键后的效果,代表的是60hz线,固定的每个间隔是16.6ms;灰色的块是点击了v键后的效果,代表每一帧,即同步信号;F标记代表每一帧的开始;在这里插入图片描述
3、加载完成后下滑到测试应用的进程处,测试的应用都是以http://com.xxx的开头的包名,通过截图也可以知道测试应用的进程pid是7154,如下图:在这里插入图片描述
4、如下图上F就是我们要解析的地方,通过W键放大如下,如果是绿色说明一帧的绘制时间<16.67ms(=1/60,针对机器是60fps的),红色代表的是严重卡顿,黄色代表卡顿,绿色代表还能处理。如:在这里插入图片描述
5、继续放大,然后点击任意F下的"Choreographer#doFrame",浏览器下面的面板出现的"Wall Duration"就代表一帧的绘制时间,图中的是5.030ms,远<16.67ms,说明该帧流畅,如果该帧的绘制时间大于16.67ms,F就是黄色和红色,如:

在这里插入图片描述
在这里插入图片描述
6、根据这样的思路,就可以把systrace文件中每帧的 "Choreographer#doFrame"的时间找出来,如果下一帧的开始时间减上一帧的开始时间除以16.67ms并向下取整不等于0,说明有掉帧;如下截图说明2帧之间有掉帧:

在这里插入图片描述
7、例外情况,本帧率计算只考虑计算“Choreographer#doFrame”这个时间,不考虑其他需要绘制的时间,相对来说是最小值。

二、systrace解析帧率原理

1、使用文本文件打开systrace文件,我们可以看到如下的内容,其中com.qiyi.video-13287 (13287) [000] … 1785.417179: tracing_mark_write:B|13287|Choreographer#doFrame就是该进程的第一个起始帧,1785.417179这个代表的是起始时间:在这里插入图片描述
2、得到了开始时间,相对应的就会有结束时间,有一个B(begin),就会对应一个E(end)其中com.qiyi.video-13287 (13287) [000]… 1785.417334: tracing_mark_write:E|13287就是相对应的结束时间(截图中删除了一些无关的内容),只需要找到最初入栈的B相对应的E就知道结束时间了,这样出栈时间减入栈时间就可以得到该标签的时间。如下:在这里插入图片描述
3、特殊情况,当systrace中出现如下情况的时候,说明当前界面没有进行绘制,体现在systrace文件中就是B与E不对等,解析的时候需要提前结束,如下截图:

在这里插入图片描述
备注网上介绍systrace解析原理的文章:systrace的log中标签时间计算原理

三、脚本解析结果与systrace的解读

1、脚本的解析结果以txt的格式保存,如下(命名方式是测试应用的pid__result_framestate.txt,包含解析的帧数、帧率、是否有掉3帧,以及帧与帧掉帧情况、每一帧的绘制时间,可以优化),每一帧起始和结束时间没有打印保存,仅作调试用:在这里插入图片描述
在这里插入图片描述
2、例如解析结果13和14帧之间丢了2帧,对应的systrace文件中的地方就是:在这里插入图片描述
3、脚本中BE出栈入栈的解析方法主要是在函数ayalyse_frame_data(out_temp_systrace_file, animator_pid)中,具体的解析方法如下:

with open(out_temp_systrace_file, encoding='utf-8', mode='r') as f:
    while True:
      line = f.readline()
      if line == "":
        break
      if isFirstFrameFlag:
        if re.compile(pattern_start_frame).search(line) is not None: #找到第一帧和第一帧的开始时间
          isFrameFlag = True
          frames_stack.append(line)  # 找到第一个,入栈
          total_frames += 1
          start_time = getTimeFromLine(line)  #第一帧开始时间,也是测试开始时间,也是每一帧的开始时间
          list_frame_start_time.append(start_time)
          isFirstFrameFlag = False
      elif re.compile(pattern_start_frame).search(line) is not None:  #找到第2、3、N帧
        isFrameFlag = True
        frame_start_time = getTimeFromLine(line)
        list_frame_start_time.append(frame_start_time) #找到前一帧的最后一个出栈帧
        if DEBUG:
          print("======打印结束帧=====")
          print(stack_temp_frame_line)
        frame_end_time = getTimeFromLine(stack_temp_frame_line)  #每一帧的结束时间,最后一帧是总的结束时间
        list_frame_end_time.append(frame_end_time)
        if len(frames_stack) != 0:  #说明在最后的BE数量不匹配,测试结束
          break
        frames_stack.append(line)  # 将B开头的入栈,碰到E出栈
        total_frames += 1
      elif re.compile(pattern_start2_frame).search(line) is not None: #遇到"tracing_mark_write: B"就入栈
        if isFrameFlag:
          frames_stack.append(line)  # 将B开头的入栈,碰到E出栈
      elif re.compile(pattern_end_frame).search(line) is not None:  #遇到"tracing_mark_write: E"就出栈
        if isFrameFlag and len(frames_stack) != 0:
          frames_stack.pop()  #不空则出栈
        #等于0时说明出栈完毕,同时该帧计算完毕
        if isFrameFlag and len(frames_stack) == 0:
          isFrameFlag = False
          stack_temp_frame_line = line  # 保存最后一个要出的E,然后在Choreographer#doFrame做计算
        #当B和E不成对的时候,说明这个时候Choreographer#doFrame(Did Not Finish),systrace的表现,暂时不知道为什么
        #出现该种情况则测试结束,后续的不需要渲染,在首帧上判断是否 len(frames_stack) != 0
        pass

特别注意脚本中的帧率时间设置:
在这里插入图片描述

使用说明:

1、安装Python3以上,然后将测试文件"测试trace.html"和脚本本"parse_systrace_tool.py"放到放到同一目录。

python  parse_systrace_tool.py  测试trace.html

2、如果脚本和测试文件不在同一个目录的话,则在测试时需要输入"测试trace.html"的完整路径

python   parse_systrace_tool.py   x:\\xx\\xx\\测试trace.html

在这里还是要推荐下我自己建的Python自动化学习群:644956177 ,群里都是学Python自动化测试的,如果你正在学习Python ,小编欢迎你加入,大家都是测试开发党,不定期分享干货(只有Python软件测试相关的),包括我自己整理的一份2021最新的Python自动化资料。

在这里插入图片描述

以上是关于Python解析systrace获取APP快速滑动界面的帧率的主要内容,如果未能解决你的问题,请参考以下文章

Sentinel滑动时间窗限流算法原理及源码解析(下)

Android Systrace 使用与解析

〖Python APP 自动化测试实战篇⑧〗- 实战 - appium 模拟手机滑动操控的操作

使用systrace的问题记录

appium+python界面滑动

如何在 Google App Engine 上用 Python 解析 xml