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快速滑动界面的帧率的主要内容,如果未能解决你的问题,请参考以下文章