Systrace的用法小结

简介: 通过SysTrace可以帮助我们分析性能问题,包含方法的耗时时长、CPU的使用情况、ANR、布局情况等;相比性能工具TraceView,主要用来分析每个方法的执行时间,对于冷启动而言,想抓trace只能通过代码的方式,这样会导致整个应用比较卡顿,测试出的方法时间,不是真正的执行时间,只能看下时间长短的相对占比。

通过SysTrace可以帮助我们分析性能问题,包含方法的耗时时长、CPU的使用情况、ANR、布局情况等;相比性能工具TraceView,主要用来分析每个方法的执行时间,对于冷启动而言,想抓trace只能通过代码的方式,这样会导致整个应用比较卡顿,测试出的方法时间,不是真正的执行时间,只能看下时间长短的相对占比。而SysTrace工具,能帮助我们解决抓取的方法时间不真实问题。

一般,抓取SysTrace在User Debug的ROM版本,抓取的信息会非常详细;如果不是User Debug版本,可以通过自定义Tag的方式来丰富信息。

自定义TAG

Trace.java的对应的自定义TAG方法如下:

img_d34a4abef9418bd4bc81f36be05f8742.png
Trace.java

traceBegin开始抓取,traceEnd结束抓取(可以嵌套调用,但是一定是要成对出现;另外注意下如果某个方法节点出现异常,会导致顺序错乱,

注意:traceTag一定是在Trace类中定义的常量,而且在抓取的SysTrace的,该TAG有勾选。

Trace.java中定义了如下TAG。

img_1d16da4b2fd79394f61320e7f3ddb923.png
Trace TAG

下面代码为自定义TAG的帮助类:

img_efc5d162ddfcb6df6c86eb181c90d52f.png
自定义TAG

在Activity的onCreate的开始和结束位置调用即可:

img_70f4920b0fb014d53f25006984fc2812.png
使用自定义TAG

这样当启动systrace的时候就会使用自定义的TAG了。如下所示:

img_19f6cdd2626502a6b4235ff193651560.png
自定义TAG结果

打开systrace文件后有如下常用快捷键:

W: 放大页面

S:缩小页面

A:左平移页面

D:右平移页面

M:快速选中区域或者取消选中区域

->: 向右移动一个事件

<-:向左移动一个事件

介绍了自定义TAG,快捷键,那么到底该如何分析trace文件呢?

查找耗时操作:

Systrace可以查看方法的执行时间,方便找出耗时操作,也可以观察出帧的绘制时间。

img_bb089c7d39c1a4ea176d46280db6febb.png
耗时操作

上图可以看出activityStart的执行时间较长,也就是app的冷启动时间较长。红色的F代表帧的绘制时间过长。

查询UI线程的等待

除了UI线程本身耗时外,有时候,我们自身业务中多线程已经执行任务,会存在同步锁问题,此时UI线程就处于Sleeping状态。

img_eaaeca40a9388e1b8c212152f992ac56.png
UI线程等待

Step1: 选中红色区域(CPU执行状态),可以看到如下统计信息:

Sleeping:表示线程处于睡眠态,显示白色

Runnable:表示线程处于可执行态显示蓝色

Running:表示线程处于运行态显示绿色

Uninterruptible Sleep: 一般表示IO操作

 从统计的信息可以看出Sleeping的时长99多ms

Step2:在CPU轴找出“白条较长”的区域,光标点击,并按M键选中,可以详细的看到该Sleeping的时长,线程信息等。

img_970ead48405e076c41571bafe6cb6c99.png

Step3:继续放到区域,可以看到在“白条区域”后面,紧接着一个“蓝条区域”,代表当前的UI线程从Sleeping态变化到了Runnable态(红色标注区域)

img_0042ae1545e5437cdb0d504e403edbff.png

Step4:点击Runnable区域,可以看到其详细信息(由于Runnable区域比较小,可以使用快捷键->,快速从Sleeping事件移动到Runnable事件);关键信息时:{wakeup from tid: 20704},可以知道UI线程被20704线程所唤醒。

img_d2d081458339a9e545bb9f17b7839175.png

Step5:搜索该线程信息:Comm:线程名称;Tid:线程id;Prio:线程优先级

img_6cb408614b11308c8ef9abdaa23af707.png
目录
相关文章
|
数据安全/隐私保护
runas的用法
今天同事的电脑安装了一个软件,运行时需要管理员权限,因为是在域环境中,无法提供管理员权限,这种情况可以用到runas。runas命令就是可以在A账户中用B账户运行某个软件。 runas /user:用户名 软件路径 在了解了runas用法后,我先在CMD中输入命令 需要输入账户密码 输入密码成功后就可以运行软件了,检查一下,是以这个用户运行的软件 后来想想运行这个命令每次都要输入管理员密码,这就没什么效果了。
2406 0
|
4月前
|
数据安全/隐私保护
关于DotNetZip的用法
关于DotNetZip的用法
25 0
|
5月前
|
机器学习/深度学习 数据可视化 API
Gymnasium的基本用法
Gymnasium的基本用法
109 0
|
11月前
|
JSON Java fastjson
JackJSON的用法
网上大多数都是FastJSON的用法,很少有JackJSON的用法。我总结了几个自己经常用到的,供大家参考。
|
C# 容器 数据格式
AvalonDock的基本用法
原文:AvalonDock的基本用法         AvalonDock是优秀的开源项目,用于创建可停靠式布局,能够在WPF中方便开发出类似VS2010的软件界面。对于复杂的软件系统,大量控件的使用会使的界面变得难以管理。
2055 0
${}用法
[el表达式],它会从page,request,session,application中取值。比如:{name}它的意思就从以上4个对象中去名为name的值。
1282 0
|
JavaScript 前端开发 C#