EN

Android Systrace 基础知识 -- Systrace 简介

Word count: 3.9kReading time: 15 min
2019/05/28
loading

本文是 Systrace 系列文章的第一篇,主要是对 Systrace 进行简单介绍,介绍其简单使用方法;如何去看 Systrace;如何结合其他工具对 Systrace 中的现象进行分析。

本系列的目的是通过 Systrace 这个工具,从另外一个角度来看待 Android 系统整体的运行,同时也从另外一个角度来对 Framework 进行学习。也许你看了很多讲 Framework 的文章,但是总是记不住代码,或者不清楚其运行的流程,也许从 Systrace 这个图形化的角度,你可以理解的更深入一些。

本文目录

Perfetto 系列文章目录

Systrace 到 Perfetto 的使用方式变化

这篇文章最早写 Systrace 时,主流程是 systrace.pyatrace,把 ftrace 和 ATRACE 数据整理成 HTML,再用 Chrome 打开。现在这个流程要拆成两层看:

  1. 底层机制没有变:android.os.Trace、Native ATRACE 宏、系统服务里的 ATRACE、Linux ftrace、CPU 调度事件仍然是分析 Android 性能问题的核心数据来源,旧文章里对 Framework 流程的解释仍然可以复用。
  2. 工具流程已经变了:新版本 platform-tools 不再把 systrace.py 当作主入口;Android 10(API 29)及之后,系统录制出来的 Trace 主要是 .perfetto-trace,默认应使用 Perfetto UItrace_processor 分析。
  3. 现在抓 Trace 有三条常用路径:通过开发者选项里的 System Tracing 快捷开关抓交互问题;通过 adb shell perfetto ... --out /data/misc/perfetto-traces/xxx.perfetto-trace 抓可复现问题;复杂配置用 Perfetto config 或 record_android_trace 脚本固化。
  4. 本文讲的 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 系列文章目录

  1. Android Perfetto 系列目录
  2. Android Perfetto 系列 1:Perfetto 工具简介
  3. Android Perfetto 系列 2:Perfetto Trace 抓取
  4. Android Perfetto 系列 3:熟悉 Perfetto View
  5. Android Perfetto 系列 4:使用命令行在本地打开超大 Trace
  6. Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程
  7. Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战
  8. Android Perfetto 系列 7 - MainThread 和 RenderThread 解读
  9. Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析
  10. Android Perfetto 系列 9 - CPU 信息解读
  11. Android Perfetto 系列 10 - Binder 调度与锁竞争
  12. 视频(B站) - Android Perfetto 基础和案例分享
  13. 视频(B站) - Android Perfetto 分享 - 出图类型分享:AOSP、WebView、Flutter + OEM 系统优化分享

Systrace 系列文章目录

  1. Systrace 简介
  2. Systrace 基础知识 - Systrace 预备知识
  3. Systrace 基础知识 - Why 60 fps ?
  4. Systrace 基础知识 - SystemServer 解读
  5. Systrace 基础知识 - SurfaceFlinger 解读
  6. Systrace 基础知识 - Input 解读
  7. Systrace 基础知识 - Vsync 解读
  8. Systrace 基础知识 - Vsync-App :基于 Choreographer 的渲染机制详解
  9. Systrace 基础知识 - MainThread 和 RenderThread 解读
  10. Systrace 基础知识 - Binder 和锁竞争解读
  11. Systrace 基础知识 - Triple Buffer 解读
  12. Systrace 基础知识 - CPU Info 解读
  13. Systrace 流畅性实战 1 :了解卡顿原理
  14. Systrace 流畅性实战 2 :案例分析: MIUI 桌面滑动卡顿分析
  15. Systrace 流畅性实战 3 :卡顿分析过程中的一些疑问
  16. Systrace 响应速度实战 1 :了解响应速度原理
  17. Systrace 响应速度实战 2 :响应速度实战分析-以启动速度为例
  18. Systrace 响应速度实战 3 :响应速度延伸知识
  19. Systrace 线程 CPU 运行状态分析技巧 - Runnable 篇
  20. Systrace 线程 CPU 运行状态分析技巧 - Running 篇
  21. 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 来分类,其中信息来源如下

  1. Framework Java 层的 TracePoint 通过 android.os.Trace 类完成
  2. Framework Native 层的 TracePoint 通过 ATrace 宏完成
  3. App 开发者可以通过 android.os.Trace 类自定义 Trace

这样 Systrace 就可以把 Android 上下层的所有信息都收集起来并集中展示,对于 Android 开发者来说,Systrace 最大的作用就是把整个 Android 系统的运行状态,从黑盒变成了白盒。全局性和可视化使得 Systrace 成为 Android 开发者在分析复杂的性能问题的时候的首选。

实践中的应用情况

解析后的 Systrace 由于有大量的系统信息,天然适合分析 Android App 和 Android 系统的性能问题, Android 的 App 开发者、系统开发者、Kernel 开发者都可以使用 Systrace 来分析性能问题。

  1. 从技术角度来说,Systrace 可覆盖性能涉及到的 响应速度卡顿丢帧ANR 这几个大类。
  2. 从用户角度来说,Systrace 可以分析用户遇到的性能问题,包括但不限于:
  3. 应用启动速度问题,包括冷启动、热启动、温启动
  4. 界面跳转速度慢、跳转动画卡顿
  5. 其他非跳转的点击操作慢(开关、弹窗、长按、选择等)
  6. 亮灭屏速度慢、开关机慢、解锁慢、人脸识别慢等
  7. 列表滑动卡顿
  8. 窗口动画卡顿
  9. 界面加载卡顿
  10. 整机卡顿
  11. 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
2
3
4
5
adb shell perfetto -t 10s -b 64mb \
sched freq idle am wm gfx view binder_driver \
--out /data/misc/perfetto-traces/trace_file.perfetto-trace

adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace .

如果要抓 App 自定义 Trace 点,可以加上包名:

1
2
3
adb shell perfetto -t 10s -b 64mb -a com.example.app \
sched freq idle am wm gfx view binder_driver \
--out /data/misc/perfetto-traces/app_trace.perfetto-trace

下面这段是旧 Systrace 的简单使用方法,适合旧系统或历史 Trace 复现:

1
2
$ cd android-sdk/platform-tools/systrace
$ python systrace.py

可以在 Bash 中配置好对应的路径和 Alias,使用起来还是很快速的。另外,User 版本所抓的 Trace 文件所包含的信息,比 eng 版本或者 Userdebug 版本要少;如果要分析系统服务、内核调度、厂商策略等问题,建议使用 Userdebug 版本的机器来 debug,这样既保证了性能,又能有比较详细的输出结果。普通 App 问题在 User 版本上也可以先用 System Tracing 或 Perfetto 抓取,只是能看到的系统细节会少一些。

旧 Systrace 抓取结束后,会生成对应的 Trace.html 文件;新 Perfetto 抓取结束后,会生成 .perfetto-trace 文件。关于如何分析 Trace 文件,我们下面的章节会讲。不论使用哪种工具,在抓取之前都可以选择参数,下面说一下旧 systrace.py 参数的意思:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 -a appname      enable app-level tracing for a comma separated list of cmdlines; * is a wildcard matching any process
-b N use a trace buffer size of N KB
-c trace into a circular buffer
-f filename use the categories written in a file as space-separated
values in a line
-k fname,... trace the listed kernel functions
-n ignore signals
-s N sleep for N seconds before tracing [default 0]
-t N trace for N seconds [default 5]
-z compress the trace dump
--async_start start circular trace and return immediately
--async_dump dump the current contents of circular trace buffer
--async_stop stop tracing and dump the current contents of circular
trace buffer
--stream stream trace to stdout as it enters the trace buffer
Note: this can take significant CPU time, and is best
used for measuring things that are not affected by
CPU performance, like pagecache usage.
--list_categories
list the available tracing categories
-o filename write the trace to the specified file instead
of stdout.

上面的参数虽然比较多,但使用工具的时候不需考虑这么多,在对应的项目前打钩即可,命令行的时候才会去手动加参数,我们一般会把这个命令配置成 Alias,比如(下面列出的 am,binder_driver 这些,不同的手机、root 和非 root,会有一些不同,可以查看下一节,使用 adb shell atrace –list_categories 来查看你的手机支持的 tag):

1
2
alias st-start='python /path-to-sdk/platform-tools/systrace/systrace.py'
alias st-start-gfx-trace = ‘st-start -t 8 am,binder_driver,camera,dalvik,freq,gfx,hal,idle,input,memory,memreclaim,res,sched,sync,view,webview,wm,workq,binder’

这样在使用的时候,可以直接敲 st-start 即可,当然为了区分和保持各个文件,还需要加上 -o xxx.html .上面的命令和参数不必一次就理解,只需要记住如何简单使用即可,在分析的过程中,这些东西都会慢慢熟悉的。

一般来说比较常用的是

  1. -o : 指示输出文件的路径和名字
  2. -t : 抓取时间(最新版本可以不用指定, 按 Enter 即可结束)
  3. -b : 指定 buffer 大小 (一般情况下,默认的 Buffer 是够用的,如果你要抓很长的 Trae, 那么建议调大 Buffer )
  4. -a : 指定 app 包名 (如果要 Debug 自定义的 Trace 点, 记得要加这个)

查看支持的 TAG

Systrace 默认支持的 TAG,可以通过下面的命令来进行抓取,不同厂商的机器可能有不同的配置,在使用的时候可以根据自己的需求来进行选择和配置,TAG 选的少的话,Trace 文件的体积也会相应的变小,但是抓取的内容也会相应变少。Trace 文件大小会影响其在 Chrome 中打开后的操作性能,所以这个需要自己取舍

以我手上的 Android 12 的机器为例,可以看到这台机器支持下面的 tag(左边是 tag 名,右边是解释)

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
42
43
44
45
46
47
48
$ 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
pdx - PDX services
sched - CPU Scheduling
irq - IRQ Events
i2c - I2C Events
freq - CPU Frequency
idle - CPU Idle
disk - Disk I/O
sync - Synchronization
workq - Kernel Workqueues
memreclaim - Kernel Memory Reclaim
regulators - Voltage and Current Regulators
binder_driver - Binder Kernel driver
binder_lock - Binder global lock trace
pagecache - Page cache
memory - Memory
thermal - Thermal event
freq - CPU Frequency and System Clock (HAL)
gfx - Graphics (HAL)
ion - ION Allocation (HAL)
memory - Memory (HAL)
sched - CPU Scheduling and Trustzone (HAL)
thermal_tj - Tj power limits and frequency (HAL)

关于我 && 博客

下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!

  1. 博主个人介绍 :里面有个人的微信和微信群链接。
  2. 本博客内容导航 :个人博客内容的一个导航。
  3. 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
  4. Android性能优化知识星球 : 欢迎加入,多谢支持~

一个人可以走的更快 , 一群人可以走的更远

微信扫一扫

CATALOG
  1. 1. 本文目录
  • Perfetto 系列文章目录
    1. 0.1. Systrace 到 Perfetto 的使用方式变化
  • Perfetto 系列文章目录
  • Systrace 系列文章目录
  • 正文
    1. 0.1. Systrace 的设计思路
    2. 0.2. 实践中的应用情况
  • 1. Systrace 简单使用
  • 2. 使用命令行工具抓取 Systrace / Perfetto
  • 查看支持的 TAG
  • 关于我 && 博客