通过SysTrace可以帮助我们分析性能问题,包含方法的耗时时长、CPU的使用情况、ANR、布局情况等;相比性能工具TraceView,主要用来分析每个方法的执行时间,对于冷启动而言,想抓trace只能通过代码的方式,这样会导致整个应用比较卡顿,测试出的方法时间,不是真正的执行时间,只能看下时间长短的相对占比。而SysTrace工具,能帮助我们解决抓取的方法时间不真实问题。
一般,抓取SysTrace在User Debug的ROM版本,抓取的信息会非常详细;如果不是User Debug版本,可以通过自定义Tag的方式来丰富信息。
自定义TAG:
Trace.java的对应的自定义TAG方法如下:
traceBegin开始抓取,traceEnd结束抓取(可以嵌套调用,但是一定是要成对出现;另外注意下如果某个方法节点出现异常,会导致顺序错乱,
注意:traceTag一定是在Trace类中定义的常量,而且在抓取的SysTrace的,该TAG有勾选。
Trace.java中定义了如下TAG。
下面代码为自定义TAG的帮助类:
在Activity的onCreate的开始和结束位置调用即可:
这样当启动systrace的时候就会使用自定义的TAG了。如下所示:
打开systrace文件后有如下常用快捷键:
W: 放大页面
S:缩小页面
A:左平移页面
D:右平移页面
M:快速选中区域或者取消选中区域
->: 向右移动一个事件
<-:向左移动一个事件
介绍了自定义TAG,快捷键,那么到底该如何分析trace文件呢?
查找耗时操作:
Systrace可以查看方法的执行时间,方便找出耗时操作,也可以观察出帧的绘制时间。
上图可以看出activityStart的执行时间较长,也就是app的冷启动时间较长。红色的F代表帧的绘制时间过长。
查询UI线程的等待
除了UI线程本身耗时外,有时候,我们自身业务中多线程已经执行任务,会存在同步锁问题,此时UI线程就处于Sleeping状态。
Step1: 选中红色区域(CPU执行状态),可以看到如下统计信息:
Sleeping:表示线程处于睡眠态,显示白色
Runnable:表示线程处于可执行态显示蓝色
Running:表示线程处于运行态显示绿色
Uninterruptible Sleep: 一般表示IO操作
从统计的信息可以看出Sleeping的时长99多ms
Step2:在CPU轴找出“白条较长”的区域,光标点击,并按M键选中,可以详细的看到该Sleeping的时长,线程信息等。
Step3:继续放到区域,可以看到在“白条区域”后面,紧接着一个“蓝条区域”,代表当前的UI线程从Sleeping态变化到了Runnable态(红色标注区域)
Step4:点击Runnable区域,可以看到其详细信息(由于Runnable区域比较小,可以使用快捷键->,快速从Sleeping事件移动到Runnable事件);关键信息时:{wakeup from tid: 20704},可以知道UI线程被20704线程所唤醒。
Step5:搜索该线程信息:Comm:线程名称;Tid:线程id;Prio:线程优先级