Systrace — 什么是Android系统追踪工具

作者: IT Sectr 发布日期: 2026-03-31 阅读时间: 9 分钟

Systrace 是一个Android系统追踪工具,在短时间内收集有关Linux内核、处理器、图形加速器和所有系统进程运行的数据。与专注于应用程序内部方法的Traceview不同,Systrace显示系统全局情况:每个CPU核心的负载、SurfaceFlinger的工作、Binder调用和GC周期。根据Google,2024的数据,该工具对于诊断丢帧、频繁垃圾回收和UI线程异常是不可或缺的。

要点

  • Systrace — 通过atrace/ftrace工作的低级Android系统追踪工具
  • 追踪 包含长达60秒的CPU、GPU、线程、SurfaceFlinger和Binder数据
  • 分析 可以查看丢帧和UI线程阻塞的确切原因
  • 集成 与Android Studio和命令行,实现灵活的捕获和自动化
  • Perfetto — Android 12+上Systrace的继任者,使用通用的protobuf格式

什么是Systrace

Systrace 是来自Android SDK的命令行工具,它从多个内核追踪(ftrace)和用户空间(atrace)源捕获并组合数据到一个HTML报告中。该工具出现在Android 4.1(Jelly Bean)中,作为旧的traceview系统分析工具的替代品,并长期是Android平台上性能诊断的标准工具。

Systrace架构

Systrace 依赖于ftrace — Linux内核追踪机制,从Android 4.1版本开始可用。运行时,Systrace激活指定的追踪类别:sched(任务调度器)、freq(CPU频率)、idle(空闲状态)、workq(工作队列)、binder、gfx等。数据收集在内核环形缓冲区中,停止后合并为单个trace.html文件,可在任何浏览器中打开。

Android Studio环境中的Systrace

从Android Studio 3.1开始,Systrace内置于CPU Profiler中。在“Trace System Calls”模式下,分析器在连接的设备上运行Systrace并直接在Android Studio窗口中显示结果。这消除了基本情况下使用命令行的需要,同时保留了全部功能 — 所有追踪类别、过滤和交互式时间线。追踪期间设备的性能略有下降,因为ftrace设计为最小开销。

Systrace如何工作

Systrace 使用两种数据收集机制:内核级别的ftrace用于系统事件,用户空间的atrace用于Android特定标记。ftrace记录上下文切换(sched_switch)、CPU频率变化(cpu_frequency)、中断(irq_handler_entry)和其他事件。atrace从Android框架添加标记 — 帧渲染的开始和结束、SurfaceFlinger调用和Binder事务。

Systrace中的帧渲染链

Systrace的关键功能 — 可视化每帧的渲染链:应用程序 → BufferQueue → SurfaceFlinger → HWC(composer) → Display。如果在任何阶段出现延迟,Systrace会显示确切原因:应用程序未及时准备缓冲区、SurfaceFlinger等待VSync或HWC无法合成图层。时间线上的帧生命周期根据状态着色:绿色(及时)、黄色(延迟)、红色(丢失)。这种可视化是优化UI性能的主要工具。

追踪类别

Systrace 支持超过20种追踪类别,每种包含一组相关事件。重要类别:gfx(图形渲染)、input(输入处理)、view(View系统)、webview(WebView)、power(功耗)、hal(硬件抽象)。对于游戏分析,通过AGI(Android GPU Inspector)细化到GPU命令的gfx类别很有用。

Systrace的关键功能

Systrace 提供了Android独有的其他分析器无法提供的功能集:系统时间线、内核级别的指标和自动问题检测。

交互式时间线

Systrace的HTML报告包含多层时间线,每条轨道对应一个进程或线程。可以放大和缩小时间尺度,单击事件查看详细信息(持续时间、发起进程、附加参数)。颜色编码有助于快速定位:绿色块 — 进程工作,蓝色 — 等待,橙色 — 中断,白色 — 空闲。

Alert消息

Systrace自动分析追踪并显示Alert消息,指示问题位置。例如:“Buffer underrun — SurfaceFlinger未能在VSync之前接收缓冲区”或“Long Binder transaction — Binder_1线程中42毫秒”。每条alert包含指向时间线相应部分的链接和修复建议。这节省了数小时的手动分析,是使用Systrace而非手动日志记录的主要原因之一。

Trace.beginSection方法

开发者可以通过Trace.beginSectionTrace.endSection API向Systrace追踪添加自定义标记。这允许直接在系统时间线上跟踪关键代码段的执行 — 例如,标记数据加载或布局计算的开始和结束。标记在应用程序轨道上显示为单独的块,并与系统事件并排可见。

类别数据典型用途
sched上下文切换,空闲状态线程阻塞,争用
gfxVSync,缓冲区准备,HWC丢帧,卡顿
binderBinder事务,延迟IPC延迟,远程调用
freqCPU频率,调频策略降频,功耗
gfx + AGIGPU命令,着色器游戏性能

如何运行Systrace

运行Systrace有两种方式:通过Android Studio CPU Profiler(“Trace System Calls”模式)或通过命令行的systrace.py Python脚本(位于platform-tools文件夹中)。每种方式都有自己的使用场景。

通过Android Studio运行

连接设备,打开Profiler(View → Tool Windows → Profiler),选择您的进程,进入CPU标签,选择“Trace System Calls”模式并按Record。5–30秒后按Stop — Android Studio将在设备上运行Systrace,等待完成并加载结果。限制:录制仅在Profiler打开时可能,这对于长时间场景或自动化不方便。

从命令行运行

对于更灵活的控制,使用systrace.py脚本。指定追踪类别、持续时间和输出文件名。示例:捕获gfx、input和sched数据10秒钟。运行需要Python 2.7+和启用了USB调试的已连接设备。在Android 12+上,Systrace已被Perfetto取代 — 命令保持不变,但脚本将调用重定向到perfetto

bash
# 在10秒内基本运行systrace
$ python systrace.py \
    --time=10 \
    -o trace.html \
    gfx input sched

# 仅gfx类别用于UI分析
$ python systrace.py \
    --time=5 \
    -t gfx \
    -o ui_trace.html

在代码中设置自定义标记

为了让代码出现在Systrace时间线上,将关键部分包裹在Trace.beginSection / Trace.endSection中。重要的是beginSectionendSection必须严格配对 — 否则Systrace会显示不正确的时间线。在Kotlin中,使用inline-extension很方便,即使在异常情况下也能确保部分关闭。

kotlin
import android.os.Trace

fun traceSection(name: String, block: () -> Unit) {
    Trace.beginSection(name)
    try {
        block()
    } finally {
        Trace.endSection()
    }
}

// 在代码中使用
traceSection("load_screen_data") {
    fetchData()
    updateUI()
}

阅读Systrace HTML报告

Systrace报告是一个自包含的HTML文件,可以在Chrome、Edge或Firefox中打开。它包含交互式时间线、进程选择面板、alert消息列表和关键指标(帧率、CPU使用率、Binder事务)。理解报告结构是有效分析的關鍵技能。

时间线和导航

时间线从左到右显示时间。每个进程和线程 — 单独的轨道。W/S键放大/缩小,A/D在时间中移动。用鼠标选择区域以放大部分。VSync线显示帧边界(60 FPS时每16.6毫秒)。如果两条VSync线之间无法容纳完整的渲染周期 — 帧已丢失。注意SurfaceFlinger轨道:如果长时间忙碌(橙色块),意味着图层合成正在减慢整体渲染。

分析alert消息

报告左侧的Alerts面板包含自动检测到的问题。每个alert可点击 — 点击时,时间线移动到问题时刻。最常见的alert:“Long Sync”(线程同步过长)、“Scheduling Delay”(调度器延迟)、“Buffer Overrun”(SurfaceFlinger缓冲区溢出)。如果alert对Scheduling Delay显示约100毫秒的值,这直接表明UI线程因后台负载而等待CPU — 需要将繁重计算移至Worker Thread。

帧生命周期和卡顿

要分析丢帧,启用SurfaceFlinger和app.gfx轨道。每帧显示为矩形:绿色(≤16毫秒)、黄色(16–32毫秒)、红色(>32毫秒)。如果在应用程序轨道上看到红色矩形,点击它 — Systrace将显示哪个方法(或系统调用)超过了限制。根据Google(Android Performance Patterns,2023),70%的卡顿问题由过长的onBindViewHolder或频繁的GC引起。

Systrace vs Perfetto:过渡到新格式

Perfetto 是Systrace的继任者,由Google在Android 9(Pie)中作为实验性工具引入,并从Android 12开始成为主要工具。Perfetto使用现代protobuf数据格式,支持长时间会话(小时而非秒),并具有用于查看追踪的Web UI。让我们分析两个系统之间的关键差异。

标准SystracePerfetto
格式HTML报告(trace.html)Protobuf(.trace / .perfetto-trace)
持续时间最多60秒小时,千兆字节数据
界面内置HTMLWeb UI(ui.perfetto.dev)
类别固定(ftrace + atrace)可扩展(对追踪进行SQL查询)
可移植性仅AndroidAndroid、Linux、Chrome、Windows

尽管过渡到Perfetto,使用Systrace的技能仍然相关:在Android 11之前的设备上默认使用,Perfetto保持与Systrace类别的向后兼容性。Android Studio CPU Profiler对新设备使用Perfetto,对旧设备使用Systrace — 对用户透明。对于CI/CD,建议使用Perfetto,因为其格式适合通过Python和SQL进行自动处理

Systrace使用示例

为了实际掌握Systrace,我们考虑两个场景:查找滚动时丢帧的原因和诊断频繁阻塞UI线程的GC。

在RecyclerView滚动时查找卡顿

使用gfx类别运行Systrace 10秒钟,在应用程序中滚动列表。在报告中找到红色帧的部分。点击问题帧并查看应用程序轨道 — 如果有“inflateLayout”或“onBindViewHolder”块宽度>16毫秒,问题出在布局膨胀或数据绑定上。解决方案:优化布局(减少ViewGroup深度,ViewStub),将图片加载移至Glide中的onAttachedToWindow。

诊断GC吞吐量

使用freq和sched类别的Systrace可以查看GC周期驱逐UI线程的频率。在时间线上找到应用程序轨道 — 如果看到周期性的20–50毫秒持续时间的块,名称为“Concurrent GC”,意味着垃圾回收器工作太频繁。添加“dalvik”类别进行详细分析。解决方案:将Bitmap转换为ByteBuffer,使用对象池(ObjectPool)进行频繁分配,通过ART参数减少堆碎片。

bash
# 使用类别运行以分析UI + GC
$ python systrace.py \
    --time=15 \
    -o gc_analysis.html \
    gfx sched dalvik freq

# 以30秒的持续时间捕获,用于可重复测试
$ python systrace.py \
    --time=30 \
    --app=com.example.app \
    -o app_trace.html

常见问题

没有root权限可以运行Systrace吗?

可以,运行Systrace不需要root访问权限。该工具使用atrace,它在任何启用了USB调试的设备上都可用。某些类别(power,freq)可能需要系统签名,但基本类别(gfx,sched,input)在所有设备上都能工作。

追踪文件的最大大小是多少?

60秒的限制与ftrace环形缓冲区的容量有关 — 长时间录制时缓冲区会被覆盖。Perfetto消除了这个限制:可以录制数小时,通过USB传输或流式写入磁盘获得大小达数千兆字节的追踪。

为什么HTML报告中没有我的应用程序数据?

可能原因:应用程序未切换到debuggable模式,清单中未添加android:debuggable=”true”标志,或使用了release版本。还检查类别中是否指定了--app=com.example.app — 否则Systrace只捕获系统进程。

如何从native代码向Systrace添加自定义标记?

对于C++,使用libcutils库中的ATRACE_BEGINATRACE_END。包含头文件并包裹所需部分。标记将出现在Systrace中您的进程轨道上,这对于分析游戏引擎(Unity,Unreal)特别有用。

在Android 12+上用什么替代Systrace?

在Android 12及更高版本上,使用Perfetto。通过ADB在设备上安装perfetto代理,以JSON格式开始录制。快速查看使用Perfetto Web UI(ui.perfetto.dev),CI使用Python的TraceProcessor进行命令导出。

总结

  • Systrace — Android系统追踪器,通过ftrace和atrace在内核级别工作
  • 在单一时间线上显示CPU、GPU、SurfaceFlinger负载和Binder事务
  • HTML报告包含自动Alert消息,指示问题和建议
  • 通过Android Studio Profiler或命令行systrace.py运行
  • UI线程至关重要:每帧必须在16.6毫秒内以维持60 FPS
  • 在Android 12+上,Systrace被Perfetto取代,支持长会话和SQL查询
  • 建议结合Systrace和Traceview进行系统和应用程序分析

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读