本文是 Systrace 系列文章的第一篇,主要是对 Systrace 进行简单介绍,介绍其简单使用方法;如何去看 Systrace;如何结合其他工具对 Systrace 中的现象进行分析。
本系列的目的是通过 Systrace 这个工具,从另外一个角度来看待 Android 系统整体的运行,同时也从另外一个角度来对 Framework 进行学习。也许你看了很多讲 Framework 的文章,但是总是记不住代码,或者不清楚其运行的流程,也许从 Systrace 这个图形化的角度,你可以理解的更深入一些。
本文目录
Perfetto 系列文章目录
Systrace 到 Perfetto 的使用方式变化
这篇文章最早写 Systrace 时,主流程是 systrace.py 调 atrace,把 ftrace 和 ATRACE 数据整理成 HTML,再用 Chrome 打开。现在这个流程要拆成两层看:
- 底层机制没有变:
android.os.Trace、Native ATRACE 宏、系统服务里的 ATRACE、Linux ftrace、CPU 调度事件仍然是分析 Android 性能问题的核心数据来源,旧文章里对 Framework 流程的解释仍然可以复用。 - 工具流程已经变了:新版本
platform-tools不再把systrace.py当作主入口;Android 10(API 29)及之后,系统录制出来的 Trace 主要是.perfetto-trace,默认应使用 Perfetto UI 或trace_processor分析。 - 现在抓 Trace 有三条常用路径:通过开发者选项里的 System Tracing 快捷开关抓交互问题;通过
adb shell perfetto ... --out /data/misc/perfetto-traces/xxx.perfetto-trace抓可复现问题;复杂配置用 Perfetto config 或record_android_trace脚本固化。 - 本文讲的 Systrace 入门概念,对应现在的 Perfetto 1:工具简介、Perfetto 2:Trace 抓取 和 Perfetto 3:熟悉 Perfetto View。
Perfetto 相比 Systrace 最大的变化不是“换了一个网页”,而是它把短 Trace、长 Trace、protobuf 文件、SQL、metrics、命令行处理和大文件打开放到同一套体系里。旧的 Systrace HTML 更适合快速肉眼扫图;新的 Perfetto 更适合把一次分析继续推进到搜索、过滤、SQL、指标化和自动化。
笔者后续会持续更新 Perfetto 系列,后续所有的图例也都会用 Perfetto 来演示。涉及到的知识点,Systrace 系列和 Perfetto 是共通的,所以也不必纠结,哪个方便用哪个,Perfetto 系列文章和 Systrace 系列文章都可以用来学习。
Perfetto 系列文章目录
- Android Perfetto 系列目录
- Android Perfetto 系列 1:Perfetto 工具简介
- Android Perfetto 系列 2:Perfetto Trace 抓取
- Android Perfetto 系列 3:熟悉 Perfetto View
- Android Perfetto 系列 4:使用命令行在本地打开超大 Trace
- Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程
- Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战
- Android Perfetto 系列 7 - MainThread 和 RenderThread 解读
- Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析
- Android Perfetto 系列 9 - CPU 信息解读
- Android Perfetto 系列 10 - Binder 调度与锁竞争
- 视频(B站) - Android Perfetto 基础和案例分享
- 视频(B站) - Android Perfetto 分享 - 出图类型分享:AOSP、WebView、Flutter + OEM 系统优化分享
Systrace 系列文章目录
- Systrace 简介
- Systrace 基础知识 - Systrace 预备知识
- Systrace 基础知识 - Why 60 fps ?
- Systrace 基础知识 - SystemServer 解读
- Systrace 基础知识 - SurfaceFlinger 解读
- Systrace 基础知识 - Input 解读
- Systrace 基础知识 - Vsync 解读
- Systrace 基础知识 - Vsync-App :基于 Choreographer 的渲染机制详解
- Systrace 基础知识 - MainThread 和 RenderThread 解读
- Systrace 基础知识 - Binder 和锁竞争解读
- Systrace 基础知识 - Triple Buffer 解读
- Systrace 基础知识 - CPU Info 解读
- Systrace 流畅性实战 1 :了解卡顿原理
- Systrace 流畅性实战 2 :案例分析: MIUI 桌面滑动卡顿分析
- Systrace 流畅性实战 3 :卡顿分析过程中的一些疑问
- Systrace 响应速度实战 1 :了解响应速度原理
- Systrace 响应速度实战 2 :响应速度实战分析-以启动速度为例
- Systrace 响应速度实战 3 :响应速度延伸知识
- Systrace 线程 CPU 运行状态分析技巧 - Runnable 篇
- Systrace 线程 CPU 运行状态分析技巧 - Running 篇
- Systrace 线程 CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇
正文
Systrace 是 Android 4.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 程序)来配置数据采集方式并生成 HTML。新流程里,perfetto负责抓取并输出.perfetto-trace,Perfetto UI 和trace_processor负责打开、查询和分析。 从实现关系看,Systrace 是对 Linux Kernel 中 ftrace 的封装;Perfetto 则是在继续支持 ATRACE/ftrace 的基础上,把更多数据源、文件格式和分析能力整合到了一起。应用进程仍然可以利用 Android 提供的 Trace 类来输出自定义 Trace 点。
关于 Systrace 的官方介绍和使用可以看这里:Systrace
Systrace 的设计思路
在系统的一些关键操作(比如 Touch 操作、Power 按钮、滑动操作等)、系统机制(input 分发、View 绘制、进程间通信、进程管理机制等)、软硬件信息(CPU 频率信息、CPU 调度信息、磁盘信息、内存信息等)的关键流程上,插入类似 Log 的信息,我们称之为 TracePoint(本质是 Ftrace 信息),通过这些 TracePoint 来展示一个核心操作过程的执行时间、某些变量的值等信息。然后 Android 系统把这些散布在各个进程中的 TracePoint 收集起来,写入到一个文件中。导出这个文件后,Systrace 通过解析这些 TracePoint 的信息,得到一段时间内整个系统的运行信息。

Android 系统中,一些重要的模块都已经默认插入了一些 TracePoint,通过 TraceTag 来分类,其中信息来源如下
- Framework Java 层的 TracePoint 通过 android.os.Trace 类完成
- Framework Native 层的 TracePoint 通过 ATrace 宏完成
- App 开发者可以通过 android.os.Trace 类自定义 Trace
这样 Systrace 就可以把 Android 上下层的所有信息都收集起来并集中展示,对于 Android 开发者来说,Systrace 最大的作用就是把整个 Android 系统的运行状态,从黑盒变成了白盒。全局性和可视化使得 Systrace 成为 Android 开发者在分析复杂的性能问题的时候的首选。
实践中的应用情况
解析后的 Systrace 由于有大量的系统信息,天然适合分析 Android App 和 Android 系统的性能问题, Android 的 App 开发者、系统开发者、Kernel 开发者都可以使用 Systrace 来分析性能问题。
- 从技术角度来说,Systrace 可覆盖性能涉及到的 响应速度 、卡顿丢帧、 ANR 这几个大类。
- 从用户角度来说,Systrace 可以分析用户遇到的性能问题,包括但不限于:
- 应用启动速度问题,包括冷启动、热启动、温启动
- 界面跳转速度慢、跳转动画卡顿
- 其他非跳转的点击操作慢(开关、弹窗、长按、选择等)
- 亮灭屏速度慢、开关机慢、解锁慢、人脸识别慢等
- 列表滑动卡顿
- 窗口动画卡顿
- 界面加载卡顿
- 整机卡顿
- App 点击无响应、卡死闪退
在遇到上述问题后,旧系统可以使用 Systrace 抓取 HTML 并在 Chrome 打开;现在的 Android 10+ 系统更建议使用 System Tracing 或 perfetto 抓取 .perfetto-trace,然后在 Perfetto UI 里分析。旧文章中的“看线程、看唤醒、看 CPU、看 Binder 等待”的方法仍然成立,只是入口从 Chrome HTML 换成了 Perfetto 的轨道、搜索、选择面板和 SQL。
Systrace 简单使用
使用 Systrace 前,要先了解一下 Systrace 在各个平台上的使用方法。早期文章里会提到 Eclipse、Android Studio Device Monitor、systrace.py 这些入口;今天真正推荐的流程已经变成 System Tracing 或 Perfetto。两套流程的操作节奏类似,但输出文件和分析工具不同。
旧流程是:
- 手机准备好你要进行抓取的界面
- 点击开始抓取,命令行就是执行
systrace.py - 手机上开始操作,不要太长时间
- 设定时间结束后生成
Trace.html,使用 Chrome 或 legacy UI 打开分析
新流程是:
- 在开发者选项里打开 System Tracing,或者用
adb shell perfetto开始录制 - 手机上复现卡顿、响应慢、启动慢等问题
- 录制结束后导出
.perfetto-trace - 使用 Perfetto UI 打开,必要时再用 SQL、metrics 或
trace_processor_shell做二次分析
一般抓到的 Systrace 文件如下
使用命令行工具抓取 Systrace / Perfetto
命令行形式比较灵活,速度也比较快,一次性配置好之后,以后再使用的时候就会很快就出结果(强烈推荐)
Systrace 工具曾经在 Android SDK 目录下的 platform-tools/systrace 里面。现在新的 platform-tools 已经不再把 systrace.py 作为推荐入口,如果还要复现旧流程,需要下载 33 之前的老版本。新项目更建议直接使用 perfetto:
1 | adb shell perfetto -t 10s -b 64mb \ |
如果要抓 App 自定义 Trace 点,可以加上包名:
1 | adb shell perfetto -t 10s -b 64mb -a com.example.app \ |
下面这段是旧 Systrace 的简单使用方法,适合旧系统或历史 Trace 复现:
1 | $ cd android-sdk/platform-tools/systrace |
可以在 Bash 中配置好对应的路径和 Alias,使用起来还是很快速的。另外,User 版本所抓的 Trace 文件所包含的信息,比 eng 版本或者 Userdebug 版本要少;如果要分析系统服务、内核调度、厂商策略等问题,建议使用 Userdebug 版本的机器来 debug,这样既保证了性能,又能有比较详细的输出结果。普通 App 问题在 User 版本上也可以先用 System Tracing 或 Perfetto 抓取,只是能看到的系统细节会少一些。
旧 Systrace 抓取结束后,会生成对应的 Trace.html 文件;新 Perfetto 抓取结束后,会生成 .perfetto-trace 文件。关于如何分析 Trace 文件,我们下面的章节会讲。不论使用哪种工具,在抓取之前都可以选择参数,下面说一下旧 systrace.py 参数的意思:
1 | -a appname enable app-level tracing for a comma separated list of cmdlines; * is a wildcard matching any process |
上面的参数虽然比较多,但使用工具的时候不需考虑这么多,在对应的项目前打钩即可,命令行的时候才会去手动加参数,我们一般会把这个命令配置成 Alias,比如(下面列出的 am,binder_driver 这些,不同的手机、root 和非 root,会有一些不同,可以查看下一节,使用 adb shell atrace –list_categories 来查看你的手机支持的 tag):
1 | alias st-start='python /path-to-sdk/platform-tools/systrace/systrace.py' |
这样在使用的时候,可以直接敲 st-start 即可,当然为了区分和保持各个文件,还需要加上 -o xxx.html .上面的命令和参数不必一次就理解,只需要记住如何简单使用即可,在分析的过程中,这些东西都会慢慢熟悉的。
一般来说比较常用的是
- -o : 指示输出文件的路径和名字
- -t : 抓取时间(最新版本可以不用指定, 按 Enter 即可结束)
- -b : 指定 buffer 大小 (一般情况下,默认的 Buffer 是够用的,如果你要抓很长的 Trae, 那么建议调大 Buffer )
- -a : 指定 app 包名 (如果要 Debug 自定义的 Trace 点, 记得要加这个)
查看支持的 TAG
Systrace 默认支持的 TAG,可以通过下面的命令来进行抓取,不同厂商的机器可能有不同的配置,在使用的时候可以根据自己的需求来进行选择和配置,TAG 选的少的话,Trace 文件的体积也会相应的变小,但是抓取的内容也会相应变少。Trace 文件大小会影响其在 Chrome 中打开后的操作性能,所以这个需要自己取舍
以我手上的 Android 12 的机器为例,可以看到这台机器支持下面的 tag(左边是 tag 名,右边是解释)
1 | adb shell atrace --list_categories |
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球 : 欢迎加入,多谢支持~
一个人可以走的更快 , 一群人可以走的更远
