一、简介
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是谁,被谁唤醒等信息。










