一、简介
Systrace是Android4.1引入的性能分析工具。利用ftrace,在系统关键位置都有埋点,主要用于分析系统调用耗时问题,可以自定义trace标签来细化调用栈。
二、启动
ddms

点击左上角按钮,出来右边选项框,上面配置文件名、持续时长、buffer大小、调试的应用程序(如果对某个应用加了trace标签,必须选上对应应用包名)
命令行
function systrace {
systrace_path=“/xxx/Android/sdk/platform-tools/systrace/systrace.py"
python $systrace_path gfx input audio view webview wm am hal app res dalvik rs bionic power sched freq idle load sync workq memreclaim irq disk binder_driver binder_lock -b 10240 -t 5 -o “/xxx/systrace/systrace-$1.html"
}
直接整理为脚本方法,配置到bashrc中去,方便抓取。
参数分为两个部分options和category
options可取值:
| options | 解释 | 
|---|---|
| -o <FILE> | 指定trace数据文件的输出路径,如果不指定就是当前目录的trace.html | 
| -t N, –time=N | 执行时间,默认5s。绝对不要把时间设的太短导致你操作没完Trace就跑完了,这样会出现Did not finish 的标签,分析数据就基本无效了 | 
| -b N, –buf-size=N | buffer大小(单位kB),用于限制trace总大小,默认无上限 | 
| -k <KFUNCS>,–ktrace=<KFUNCS> | 追踪kernel函数,用逗号分隔 | 
| -a <APP_NAME>,–app=<APP_NAME> | 这个选项可以开启指定包名App中自定义Trace Label的Trace功能。也就是说,如果你在代码中使用了Trace.beginSection("tag"), Trace.endSection;默认情况下,你的这些代码是不会生效的,因此,这个选项一定要开启 | 
| –from-file=<FROM_FILE> | 从文件中创建互动的systrace | 
| -e <DEVICE_SERIAL>,–serial=<DEVICE_SERIAL> | 指定设备,在特定连接设备上进行跟踪,由设备序列号标识 。 | 
| -l, –list-categories | 这个用来列出你分析的那个手机系统支持的Trace模块,一般来说,高版本的支持的模块更多 | 
category可取值:
| category | 解释 | 
|---|---|
| gfx | Graphic系统的相关信息 | 
| input | Input | 
| view | View绘制相关信息 | 
| webview | WebView | 
| wm | Window Manager | 
| am | Activity Manager | 
| sm | Sync Manager | 
| audio | Audio | 
| video | Video | 
| camera | Camera | 
| hal | Hardware Modules | 
| app | Application | 
| res | Resource Loading | 
| dalvik | 虚拟机相关信息 | 
| rs | RenderScript | 
| bionic | Bionic C Library | 
| power | Power Management | 
| sched | CPU调度的信息 | 
| binder_driver | Binder驱动的相关信息 | 
| core_services | SystemServer中系统核心Service的相关信息 | 
| irq | IRQ Events | 
| freq | CPU Frequency | 
| idle | CPU Idle | 
| disk | Disk I/O | 
| mmc | eMMC commands | 
| load | CPU Load | 
| sync | Synchronization | 
| workq | Kernel Workqueues | 
| memreclaim | Kernel Memory Reclaim | 
| regulators | Voltage and Current Regulators | 
三、标签添加
app:
Trace.beginSection("issueMethod");
issueMethod();
Trace.endSection();
framework java:
 Trace.traceBegin(Trace.TRACE_TAG_VIEW, "inflate”);
 Trace.traceEnd(Trace.TRACE_TAG_VIEW);
native:
#define ATRACE_TAG ATRACE_TAG_ALWAYS
#include <utils/Trace.h> // for c++
#include <cutils/trace.h> // for c
ATRACE_CALL();
ATRACE_BEGIN();
ATRACE_END();
四、Systrace特征

1:帧点:对60hz频率来说,绿:16.6ms内,黄、红均为超过16.6ms,红比黄更严重。
2:task状态
- 灰色:Sleeping
 - 蓝色:Runnable 它可以运行,但是需要等待调度程序唤醒
 - 绿色:Running
 - 橙色:Uninterruptible sleep 不响应信号
 
3:函数调用
对应issue function处理:通过traceview来定位具体耗时问题,增加trace标签细化调用栈确认问题。
iq:system_erver端事件读取

CPU

从频率最大值能了解CPU架构,从调度看繁忙程度和调度任务,同时可以观察freq是否跑在最大值等。
五、使用

1 看细节,比如框调度、框CPU和对应应用程序调用栈看详细数据
2 看范围,比如看某个阶段的执行时长

搜索框:
1 页面搜索 比如快速定位到左边栏对应的包名、进程uid等。
2 systrace内部内容搜索 比如确认pid、tid是谁,被谁唤醒等信息。










