简介
Systrace 是 Android4.1 中新增的性能数据采样和分析工具。它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger/SystemServer/Kernel/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。
Systrace 的功能包括跟踪系统的 I/O 操作、内核工作队列、CPU 负载以及 Android 各个子系统的运行状况等。在 Android 平台中,它主要由3部分组成:
- 内核部分:Systrace 利用了 Linux Kernel 中的 ftrace 功能。所以,如果要使用 Systrace 的话,必须开启 kernel 中和 ftrace 相关的模块。
- 数据采集部分:Android 定义了一个 Trace 类。应用程序可利用该类把统计信息输出给ftrace。同时,Android 还有一个 atrace 程序,它可以从 ftrace 中读取统计信息然后交给数据分析工具来处理。
- 数据分析工具:Android 提供一个 systrace.py( python 脚本文件,位于 Android SDK目录/platform-tools/systrace 中,其内部将调用 atrace 程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集 ftrace 统计数据并生成一个结果网页文件供用户查看。 从本质上说,Systrace 是对 Linux Kernel中 ftrace 的封装。应用进程需要利用 Android 提供的 Trace 类来使用 Systrace.
关于 Systrace 的官方介绍和使用可以看这里:Systrace
Systrace简单使用
- Eclipse或Studio,手机准备好你要进行抓取的界面
- 点击开始抓取(命令行的话就是开始执行命令)
- 手机上开始操作
- 设定好的时间到了之后,会将生成 Trace.html 文件,使用?Chrome?将这个文件打开进行分析
Systrace 文件如下
使用命令行工具抓取 Systrace
Systrace 工具在 Android-SDK 目录下的 platform-tools 里面,下面是简单的使用方法
1
2
| $ cd android-sdk/platform-tools/systrace
$ python systrace.py
|
可以在 Bash 中配置好对应的路径和 Alias,使用起来还是很快速的。另外 User 版本所抓的 Systrce 文件所包含的信息,是比 eng 版本或者 Userdebug 版本要少的,建议使用 Userdebug 版本的机器来进行 debug,这样既保证了性能,又能有比较详细的输出结果.
抓取结束后,会生成对应的 Trace.html 文件,注意这个文件只能被 Chrome 打开。关于如何分析 Trace 文件,我们下面的章节会讲。不论使用那种工具,在抓取之前都可以选择参数,下面说一下这些参数的意思:
-
-h, –help Show the help message.(帮助) -
-o?Write the HTML trace report to the specified file.(即输出文件名,) -
-t?N, –time=N Trace activity for N seconds. The default value is 5 seconds. (Trace抓取的时间,一般是 : -t 8) -
-b?N, –buf-size=N Use a trace buffer size of N kilobytes. This option lets you limit the total size of the data collected during a trace. -
-k -
—ktrace= Trace the activity of specific kernel functions, specified in a comma-separated list. -
-l, –list-categories List the available tracing category tags. The available tags are(下面的参数不用翻译了估计大家也看得懂,贴官方的解释也会比较权威,后面分析的时候我们会看到这些参数的作业的):
- gfx?- Graphics
- input?- Input
- view?- View
- webview - WebView
- wm?- Window Manager
- am?- Activity Manager
- audio - Audio
- video - Video
- camera - Camera
- hal - Hardware Modules
- res - Resource Loading
- dalvik?- Dalvik VM
- rs - RenderScript
- sched?- CPU Scheduling
- freq?- CPU Frequency
- membus?- Memory Bus Utilization
- idle?- CPU Idle
- disk?- Disk input and output
- load?- CPU Load
- sync?- Synchronization Manager
- workq?- Kernel Workqueues Note: Some trace categories are not supported on all devices. Tip: If you want to see the names of tasks in the trace output, you must include the sched category in your command parameters.
-
-a -
—app= Enable tracing for applications, specified as a comma-separated list of package names. The apps must contain tracing instrumentation calls from the Trace class. For more information, see Analyzing Display and Performance. -
—link-assets?Link to the original CSS or JavaScript resources instead of embedding them in the HTML trace report. -
—from-file= Create the interactive Systrace report from a file, instead of running a live trace. -
—asset-dir= Specify a directory for the trace report assets. This option is useful for maintaining a single set of assets for multiple Systrace reports. -
-e -
—serial= Conduct the trace on a specific connected device, identified by its device serial number. 上面的参数虽然比较多,但使用工具的时候不需考虑这么多,在对应的项目前打钩即可,命令行的时候才会去手动加参数:
我们一般会把这个命令配置成Alias,配置如下:
1
2
| alias st-start='python /sdk/platform-tools/systrace/systrace.py'
alias st-start-gfx-trace = ‘st-start -t 8 gfx input view sched freq wm am hwui workq res dalvik sync disk load perf hal rs idle mmc’
|
这样在使用的时候,可以直接敲?st-start?即可,当然为了区分和保持各个文件,还需要加上?-o xxx.html?.上面的命令和参数不必一次就理解,只需要记住如何简单使用即可,在分析的过程中,这些东西都会慢慢熟悉的。
一般来说比较常用的是
- -o : 指示输出文件的路径和名字
- -t : 抓取时间(最新版本可以不用指定, 按 Enter 即可结束)
- -b : 指定 buffer 大小 (一般情况下,默认的 Buffer 是够用的,如果你要抓很长的 Trae , 那么建议调大 Buffer )
- -a : 指定 app 包名 (如果要 Debug 自定义的 Trace 点, 记得要加这个)
查看支持的 TAG
Systrace 默认支持的 TAG,可以通过下面的命令来进行抓取,不同厂商的机器可能有不同的配置,在使用的时候可以根据自己的需求来进行选择和配置,TAG 选的少的话,Trace 文件的体积也会相应的变小,但是抓取的内容也会相应变少。Trace 文件大小会影响其在 Chrome 中打开后的操作性能,所以这个需要自己取舍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| $ adb shell atrace --list_categories
gfx - Graphics
input - Input
view - View System
webview - WebView
wm - Window Manager
am - Activity Manager
sm - Sync Manager
audio - Audio
video - Video
camera - Camera
hal - Hardware Modules
res - Resource Loading
dalvik - Dalvik VM
rs - RenderScript
bionic - Bionic C Library
power - Power Management
pm - Package Manager
ss - System Server
database - Database
network - Network
adb - ADB
vibrator - Vibrator
aidl - AIDL calls
nnapi - NNAPI
rro - Runtime Resource Overlay
core_services - Core services
pdx - PDX services
sched - CPU Scheduling
freq - CPU Frequency
idle - CPU Idle
disk - Disk I/O
sync - Synchronization
memreclaim - Kernel Memory Reclaim
binder_driver - Binder Kernel driver
binder_lock - Binder global lock trace
memory - Memory
freq - CPU Frequency and System Clock (HAL)
gfx - Graphics (HAL)
ion - ION Allocation (HAL)
sched - CPU Scheduling and Trustzone (HAL)
|
添加Trace埋点
自定义Trace TAG
使用Trace.beginSection() 和 Trace.endSection() 定义代码段
@Override
protected void onCreate(Bundle savedInstanceState) {
Trace.beginSection("MainActivity.onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.rv_main);
Trace.beginSection("MainActivity.initData");
initData();
Trace.endSection();
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
mAdapter = new MyAdapter(this, mData);
mRecyclerView.setAdapter(mAdapter);
Trace.endSection();
}
其中Trace.endSection(); 与最近的Trace.beginSection("SelfTag"); 配对结束。
使用命令
systrace.py 脚本中 -a 参数写自己的进程名字
python systrace.py -a com.xxx.xxx
|