这篇是 2015 年的 Systrace 工具介绍,里面提到的 Eclipse、Device Monitor、sdk/tools/systrace、User 版本不能抓 Trace 等流程,已经不适合作为今天的默认操作路径。旧文章保留的是 Systrace 的基本概念:它为什么能把 SurfaceFlinger、WindowManager、View、CPU 调度等系统行为放到一张时间线上。今天真正抓取和分析 Trace,应优先看 Android Perfetto 系列目录。
现在的工具流程可以直接按下面理解:
| 旧流程 | 新流程 |
|---|---|
| Eclipse / Android Studio Device Monitor 里点 Systrace | 开发者选项里打开 System Tracing,或使用 adb shell perfetto |
python systrace.py --time=10 -o trace.html ... |
adb shell perfetto -t 10s -b 64mb ... --out /data/misc/perfetto-traces/trace.perfetto-trace |
| 输出 HTML,用 Chrome 打开 | 输出 .perfetto-trace,用 Perfetto UI 或 trace_processor 打开 |
| 主要靠肉眼在 HTML 里缩放和点击 | 先看轨道和 Slice,再结合搜索、SQL、metrics 做证据收敛 |
| User 版本基本不可用 | User 版本可以先抓有限信息;系统级细节仍建议 Userdebug/eng |
本文是Android性能优化工具系列的第一篇,这个系列主要介绍Android性能优化过程中会使用到的一些工具,以及如何用这些工具来发现问题和解决问题。在性能优化方面,Android有不少性能工具供大家来使用,按照我们一贯地 “发现问题-解决问题”的思路来看,发现问题才是最主要的,一上来就想着如何去解决问题,反而会事倍功半。
这一篇先来简单介绍一下Systrace这个工具。
Systrace简单介绍
Systrace是Android4.1中新增的性能数据采样和分析工具。它可帮助开发者收集Android关键子系统(如surfaceflinger、WindowManagerService等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目录/tools/systrace中,其内部将调用atrace程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集ftrace统计数据并生成一个结果网页文件供用户查看。 从实现关系看,Systrace是对Linux Kernel中ftrace的封装。应用进程需要利用Android提供的Trace类来使用Systrace.
关于Systrace的官方介绍和使用可以看这里:Systrace
Systrace简单使用
使用Systrace前,要先了解一下Systrace在各个平台上的使用方法,鉴于大家使用Eclipse和Android Studio的居多,所以直接摘抄官网关于这个的使用方法,不过不管是什么工具,流程是一样的:
- 手机准备好你要进行抓取的界面
- 点击开始抓取(命令行的话就是开始执行命令)
- 手机上开始操作
- 设定好的时间到了之后,会将生成Trace文件,使用Chrome将这个文件打开进行分析
Using Eclipse
In Eclipse, open an Android application project.
Switch to the DDMS perspective, by selecting Window > Perspectives > DDMS.
In the Devices tab, select the device on which to run a trace. If no devices are listed, make sure your device is connected via USB cable and that debugging is enabled on the device.
Click the Systrace icon at the top of the Devices panel to configure tracing.
Set the tracing options and click OK to start the trace.
Using ** Android Studio**
In Android Studio, open an Android application project.
Open the Device Monitor by selecting Tools > Android > Monitor.
In the Devices tab, select the device on which to run a trace. If no devices are listed, make sure your device is connected via USB cable and that debugging is enabled on the device.
Click the Systrace icon at the top of the Devices panel to configure tracing.
Set the tracing options and click OK to start the trace.
Using Device Monitor
Navigate to your SDK tools/ directory.
Run the monitor program.
In the Devices tab, select the device on which to run a trace. If no devices are listed, make sure your device is connected via USB cable and that debugging is enabled on the device.
Click the Systrace icon at the top of the Devices panel to configure tracing.
Set the tracing options and click OK to start the trace.
Command Line Usage
命令行形式比较灵活,速度也比较快,一次性配置好之后,以后再使用的时候就会很快就出结果(强烈推荐)
今天的新命令行入口是 perfetto。例如:
1 | adb shell perfetto -t 10s -b 64mb \ |
如果要抓 App 里的 android.os.Trace 自定义点,可以加包名:
1 | adb shell perfetto -t 10s -b 64mb -a com.example.app \ |
下面是旧 Systrace 命令,适合读历史文章或复现旧系统环境:
1 | $ cd android-sdk/platform-tools/systrace |
从上面的命令可以看到旧 Systrace 工具的位置,只需要在 Bash 中配置好对应的路径和 Alias,使用起来还是很快速的。这里原文说 User 版本不可以抓 Trace,是早期项目经验下的判断;现在更准确的说法是:User 版本可以通过 System Tracing / Perfetto 抓到一部分信息,但系统服务、内核、厂商策略相关细节会受权限和构建类型限制。要做系统级性能分析,仍然优先使用 Userdebug 或 eng。
旧 Systrace 抓取结束后,会生成对应的 HTML Trace 文件;新 Perfetto 抓取结束后,会生成 .perfetto-trace 文件。旧 HTML 可以在 Chrome 或 Perfetto legacy UI 打开,新文件优先在 Perfetto UI 打开。关于如何分析 Trace 文件,我们下面的章节会讲。不论使用哪种工具,在抓取之前都会选择参数,下面先保留旧 systrace.py 参数的意思:
-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 | alias st-start='python /home/gaojianwu/Software/android-studio/sdk/platform-tools/systrace/systrace.py' |
这样在使用的时候,可以直接敲 st-start 即可,当然为了区分和保持各个文件,还需要加上 -o xxx.Trace .上面的命令和参数不必一次就理解,只需要记住如何简单使用即可,在分析的过程中,这些东西都会慢慢熟悉的。
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球 : 欢迎加入,多谢支持~
一个人可以走的更快 , 一群人可以走的更远
