前言
Systrace 可以帮助开发者收集Android关键子系统(SurfaceFlinger、WMS等Framework 部分关键模块、服务,View体系系统等)的运行信息。Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载以及Android各个子系统的运行状况等。对于UI显示性能,比如动画播放不流畅、渲染卡顿等问题提供了分析数据。
Systrace 工具安装使用
Systrace 工具包会在sdk/platform-tools/systrace/ 目录下,如图所示:
Windows上搭建Systrace环境
-
进入到Systrace 所在目录,输入 systrace.py -l 命令。如果你的操作系统没有搭建python环境。会报错信息:ImportError: No module named win32con 。 Python环境配置 -
接下来,安装win32con模块。使用 pip install pypiwin32 命令。报错信息: 通过信息可知,需要安装pip工具。安装pip阅读这篇文章windows上pip安装及使用详解
继续 安装win32con模块,使用 pip install pypiwin32 命令。 win32con 安装成功!
- 再次调用 systrace.py -l命令。报错如下:
重新安装six模块,调用 pip uninstall six 和 pip install six 命令。 - 再次输入 systrace.py -l 命令。如图所示:
搭建Systrace环境 搭建成功!!
使用Systrace 命令
输入命令:python systrace.py -t 5 -o mytrace.html wm gfx input view sched freq 生成trace.html 文件 。 命令格式解析:
python systrace.py [options] [category1] [category2] ... [categoryN]
上面的命令中, -t 5 -o mytrace.html 属于 [options] 参数,wm gfx input view sched freq 属于 [categories] 参数
命令参数说明
全局选项 | 缩写 | 含义 |
---|
–help | -h | 显示帮助消息。 | –list-categories | -l | 列出您的已连接设备可用的跟踪类别。 |
options | 缩写 | 含义 |
---|
-o | 无 | 将 HTML 跟踪报告写入指定的文件。如果您未指定此选项,systrace 会将报告保存到 systrace.py 所在的目录中,并将其命名为 trace.html。 | –time=N | -t N | 跟踪设备活动 N 秒。如果您未指定此选项,systrace 会提示您在命令行中按 Enter 键结束跟踪。 | –buf-size=N | -b N | 使用 N KB 的跟踪缓冲区大小。使用此选项,您可以限制跟踪期间收集到的数据的总大小。 | –app=app-name | -a app-name | 启用对应用的跟踪,指定为包含进程名称的逗号分隔列表。这些应用必须包含 Trace 类中的跟踪检测调用。您应在分析应用时指定此选项。 | –serial=device-serial | -e device-serial | 在已连接的特定设备上进行跟踪。 | –from-file=file-path | 无 | 根据文件(例如包含原始跟踪数据的 TXT 文件)创建交互式 HTML 报告,而不是运行实时跟踪。 | –ktrace=functions | -k functions | 跟踪逗号分隔列表中指定的特定内核函数的活动。 |
categories | 全称 | 含义 |
---|
sched | CPU Scheduling | CPU 的调度信息,可以看到 CPU 的每个核在具体的时间点执行了什么线程 | gfx | Graphics | Graphics 渲染系统,包括 SurfaceFlinger、VSync、Texture、RenderThread 的信息 | input | Input | 输入事件系统,记录键盘输入、触摸等事件信息 | view | View System | View 视图系统,常见的 View 的 onMeasure、onLayout、onDraw 都记录在此系统中 | wm | Window Manager | WindowManager 的调用信息记录在此模块中 | am | Activity Manager | ActivityManager 的调用信息记录在此模块中 | dalvik | Dalvik VM | 虚拟机相关信息,比如 GC 垃圾回收信息 |
浏览trace.html 文件基础
用chrome浏览器打开该文件,如图所示: 如上图所示,横坐标是以时间为单位,纵坐标是以进程-线程的方式来划分,同一进程的线程为一组放在一起,可收缩/展开。
键盘快捷键:
解读Systrace报告
Systrace 会生成包含多个部分的输出HTML文件。该报告列出了每个进程的线程。如果给定线程会渲染界面帧,该报告还会沿时间轴指明所渲染的帧。当您在报告中从左向右移动时,时间会向前推移。
用户互动
这部分部分包含表示应用或游戏中的具体用户互动(例如点按设备屏幕)的条形图。这些互动可用作有用的时间标记。
CPU 活动
这部分显示了表示每个CPU中的线程活动的条形图。这些条形会显示所有应用(包括您的应用或游戏)中的 CPU 活动。 如上图所示,CPU 活动部分可以展开,展开后您就可以查看每个CPU的时钟频率。
系统事件
此部分中的直方图会显示特定的系统级事件,例如特定对象的纹理计数和总大小。值得仔细检查的直方图是标记为 SurfaceView 的直方图。 如上图所示,描绘 Surface Flinger进程(包括VSync事件和界面线程交换工作)的其他直方图。
显示帧
线程正在完成与某个进程相关的工作或正在响应中断。
线程可以运行但目前未进行调度。
线程没有可执行的任务,可能是因为线程在遇到斥锁定时被阻止。
线程在遇到 I/O 操作时被阻止或正在等待磁盘操作完成。
线程在遇到另一项内核操作(通常是内存管理)时被阻止。
自定义事件
默认情况下,Systrace 都只能记录、收集系统层面的信息。Android提供了这样的 Api的,这个类是Trace类,使用Trace类记录自己应用中的信息。
Trace.beginSection("TAG"); // 开始
try{
// 调试代码
....
}finally{
Trace.endSection();
}
注意:
- Trace.beginSection(String sectionName) 和 Trace.endSection() 需要成对出现,建议使用用 try{ } finally{} 。
- Trace.beginSection(String sectionName) 和 Trace.endSection() 需要在同一线程中。
- 如果在 Trace.endSection() 之前有多个 Trace.beginSection(String sectionName),Trace.endSection() 会匹配离它最近的一个未匹配过的 Trace.beginSection(String sectionName)。
检测卡顿案例
下面是对RecyclerView 列表滑动卡顿现象分析的实例。如图所示: Systrace 报告列出了渲染界面帧的每个进程,并指明了沿时间轴渲染的每个帧。我们知道1s内会渲染60帧,渲染一帧需要16.6ms。在16.6ms内渲染的必须保持每秒60帧稳定帧速率的帧会以绿色圆圈表示。渲染时间超过16.6ms的帧会以黄色或红色帧圆圈表示(潜在卡顿因素)。
点击红色个帧圆圈可将其突出显示,并提供有关系统为渲染该帧所做工作的其他信息,包括提醒。此报告还会显示系统在渲染该帧时执行的方法。您可以调查这些方法以确定界面卡顿的可能原因。 如上图所示,查看此工具在您的跟踪记录中发现的每条提醒以及设备触发每条提醒的次数,请点击窗口最右侧的Alerts标签页。Alerts面板可帮助您了解跟踪记录中出现的问题以及这些问题导致出现卡顿的频率。您可以将此面板视为要修正的错误列表。通常情况下,只需对一个区域进行细微改动或改进即可移除整组提醒。
参考资料
浏览 Systrace 报告
|