Systrace
概述
Systrace允许你监视和跟踪Android系统的行为(trace)。它会告诉你系统都在哪些工作上花费时间、CPU周期都用在哪里,甚至你可以看到每个线程、进程在指定时间内都在干嘛。它同时还会突出观测到的问题,从垃圾回收到渲染内容都可能是问题对象,甚至提供给你建议的解决方案。
Systrace分为三个部分:
- 内核部分:Systrace以Linux Kernel的ftrace为基础。
- 数据采集:Android定义的Trace类,提供了把信息输出到ftrace的功能。同时,Android还有一个atrace程序,它可以从ftrace中读取统计信息然后交给数据分析工具来处理。
- 数据生成:SDK提供了systrace.py用来收集ftrace统计数据并生成一个结果网页文件供用户查看。
Android4.1以上已经在关键进程和模块添加了Systrace。
命令行方式启动
python systrace.py [options] [category1] [category2] ... [categoryN]
options参数:

category参数:

快捷操作

图形界面启动
Tools > Android > Android Device Monitor

分析
Frames
产生的html格式的trace文件必须使用Google Chrome打开,才能正确地解析并已图标形式展现。上图中红色圈起来的,都是可以点击操作的地方,最上方是搜索栏,往下处是Alerts按钮,再往下是鼠标操作模式。
在每个app进程,都有一个Frames行,正常情况以绿色的圆点表示。当圆点颜色为黄色或者红色时,意味着这一帧超过16.6ms(即发现丢帧),这时需要通过放大那一帧进一步分析问题。对于Android 5.0(API level 21)或者更高的设备,该问题主要聚焦在UI Thread和Render Thread这两个线程当中。对于更早的版本,则所有工作在UI Thread。
分析警报信息,解决问题
选中其中某一个非绿色(F) 或 (▲) 之后,可以看见相关的警报信息,如名称,消耗,描述等。知道警报信息之后,可以用Traceview分析具体出问题的函数。
代码中添加trace
在4.3以后,可以使用Trace类在代码中打Systrace,来详细记录代码的行为。通常Trace类要一定的开销。
public void ProcessPeople() {
Trace.beginSection("ProcessPeople");
try {
Trace.beginSection("Processing Jane");
try {
// code for Jane task...
} finally {
Trace.endSection(); // ends "Processing Jane"
}
Trace.beginSection("Processing John");
try {
// code for John task...
} finally {
Trace.endSection(); // ends "Processing John"
}
} finally {
Trace.endSection(); // ends "ProcessPeople"
}
}