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