前言
本章主要是针对初识Systrace的同学,这里讲解Systrace的基本使用。
一、Systrace介绍
二、Systrace使用
三、如何使用命令抓取trace信息
一、Systrace介绍
Systrace是Android4.1版本之后推出的,主要用来分析android性能问题(主要诊断应用的不流畅的问题),trace信息中大致包含以下内容。
1. CPU使用情况
2. UI刷新掉帧情况
3. 函数执行时间情况
4. Android各个子系统的运行状况
二、Systrace使用
1.通过DDMS的Systrace工具来抓起trace信息
打开DDMS,在Android SDK目录下可以启动DDMS,位于android/sdk/tools目录下,(windows下直接点击monitor.bat启动即可,linux下在命令行执行./minitor)
你在抓取trace的时候,需要先链接设备,对应选择你要抓取的进程,之后点击如下图红色圈的按钮,设置systrace抓取的相关数据
Destibnation File :抓取trace文件的保持路径
Trace duration :抓取的时长,这里需要注意一下,尽量在15s以内,太长时间可能会造成抓取超时数据丢失的问题
Trace Buffer Size 抓取内容的大小,默认即可
Enable Application Traces from :对应抓取的进程
*Commonly Used Tags:默认都选择即可
Advanced Options :抓取相关数据类型,可以选择,或者全部选择都可以
选择完之后点击ok,此时要同步操作你设备的对应app或者对应流程,比如我发现我自己listview滑动的时候会很卡,此时点击ok后,同时操作滑动listview界面,此时Systrace就会抓取你设定时间内的trace,最后会在你设置的输出目录下生成一个trace.html文件,这个文件需要用Google Chrom浏览器来打开
[后面文章会详细讲解Trace的分析]
三、如何使用命令抓取trace信息
3.1 android-sdk自带了trace.py工具
命令如下
python systrace.py [options] [category1] [category2] ... [categoryN]
android-sdk/platform-tools/systrace
//cd到当前目录执行以下命令,在执行以下命令的时候要准备好操作你的设备
python systrace.py --time=10 -o mytrace.html sched gfx view wm
3.2 相关options
options | 描述 |
---|---|
-o file | 输出的目标文件 |
-t N, –time=N | 执行时间,默认5s |
-b N, –buf-size=N | 用于限制trace总大小 |
-k KFUNCS,–ktrace= KFUNCS | 追踪kernel函数,用逗号分隔 |
-a < APP_NAME >,–app=< APP_NAME > | 追踪应用包名,用逗号分隔 |
–from-file=< FROM_FILE > | 从文件中创建互动的systrace |
-e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > | 指定设备 |
-l, –list-categories | 可举例用的tag |
3.3 相关category
category | 描述 |
---|---|
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 |
app | Applacation |
res | Resource Loading |
dalvik | Dalvik VM |
rs | RenderScript |
bionic | Bionic C Library |
power | Power Management |
sched | CPU Scheduling |
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 |
3.4 在app添加自己的systrace log
Trace.traceBegin("performTraversals");
try {
……
} finally {
Trace.traceEnd();
}
需要保证 traceBegin 与 traceEnd 一定要成对出现。 并且一定要在同一个线程里面。Trace.traceBegin和Trace.traceEnd();之间也是可以再用Trace.traceBegin和Trace.traceEnd的,加入trace的好处在于,生成的trace文件中,会在跟踪的代码段执行对应时间轴区间打上一个tag标记(比如上例中的performTraversals)如果在代码中加入了trace,在生成trace文件时,必须指定进程为trace所在的进程
相关参考文献
https://www.jianshu.com/p/0670fe8507ff
https://www.pianshen.com/article/550436274/