Systrace 是一个Android系统追踪工具,在短时间内收集有关Linux内核、处理器、图形加速器和所有系统进程运行的数据。与专注于应用程序内部方法的Traceview不同,Systrace显示系统全局情况:每个CPU核心的负载、SurfaceFlinger的工作、Binder调用和GC周期。根据Google,2024的数据,该工具对于诊断丢帧、频繁垃圾回收和UI线程异常是不可或缺的。
要点
Systrace 是来自Android SDK的命令行工具,它从多个内核追踪(ftrace)和用户空间(atrace)源捕获并组合数据到一个HTML报告中。该工具出现在Android 4.1(Jelly Bean)中,作为旧的traceview系统分析工具的替代品,并长期是Android平台上性能诊断的标准工具。
Systrace 依赖于ftrace — Linux内核追踪机制,从Android 4.1版本开始可用。运行时,Systrace激活指定的追踪类别:sched(任务调度器)、freq(CPU频率)、idle(空闲状态)、workq(工作队列)、binder、gfx等。数据收集在内核环形缓冲区中,停止后合并为单个trace.html文件,可在任何浏览器中打开。
从Android Studio 3.1开始,Systrace内置于CPU Profiler中。在“Trace System Calls”模式下,分析器在连接的设备上运行Systrace并直接在Android Studio窗口中显示结果。这消除了基本情况下使用命令行的需要,同时保留了全部功能 — 所有追踪类别、过滤和交互式时间线。追踪期间设备的性能略有下降,因为ftrace设计为最小开销。
Systrace 使用两种数据收集机制:内核级别的ftrace用于系统事件,用户空间的atrace用于Android特定标记。ftrace记录上下文切换(sched_switch)、CPU频率变化(cpu_frequency)、中断(irq_handler_entry)和其他事件。atrace从Android框架添加标记 — 帧渲染的开始和结束、SurfaceFlinger调用和Binder事务。
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 提供了Android独有的其他分析器无法提供的功能集:系统时间线、内核级别的指标和自动问题检测。
Systrace的HTML报告包含多层时间线,每条轨道对应一个进程或线程。可以放大和缩小时间尺度,单击事件查看详细信息(持续时间、发起进程、附加参数)。颜色编码有助于快速定位:绿色块 — 进程工作,蓝色 — 等待,橙色 — 中断,白色 — 空闲。
Systrace自动分析追踪并显示Alert消息,指示问题位置。例如:“Buffer underrun — SurfaceFlinger未能在VSync之前接收缓冲区”或“Long Binder transaction — Binder_1线程中42毫秒”。每条alert包含指向时间线相应部分的链接和修复建议。这节省了数小时的手动分析,是使用Systrace而非手动日志记录的主要原因之一。
开发者可以通过Trace.beginSection和Trace.endSection API向Systrace追踪添加自定义标记。这允许直接在系统时间线上跟踪关键代码段的执行 — 例如,标记数据加载或布局计算的开始和结束。标记在应用程序轨道上显示为单独的块,并与系统事件并排可见。
| 类别 | 数据 | 典型用途 |
|---|---|---|
| sched | 上下文切换,空闲状态 | 线程阻塞,争用 |
| gfx | VSync,缓冲区准备,HWC | 丢帧,卡顿 |
| binder | Binder事务,延迟 | IPC延迟,远程调用 |
| freq | CPU频率,调频策略 | 降频,功耗 |
| gfx + AGI | GPU命令,着色器 | 游戏性能 |
运行Systrace有两种方式:通过Android Studio CPU Profiler(“Trace System Calls”模式)或通过命令行的systrace.py Python脚本(位于platform-tools文件夹中)。每种方式都有自己的使用场景。
连接设备,打开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。
# 在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中。重要的是beginSection和endSection必须严格配对 — 否则Systrace会显示不正确的时间线。在Kotlin中,使用inline-extension很方便,即使在异常情况下也能确保部分关闭。
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文件,可以在Chrome、Edge或Firefox中打开。它包含交互式时间线、进程选择面板、alert消息列表和关键指标(帧率、CPU使用率、Binder事务)。理解报告结构是有效分析的關鍵技能。
时间线从左到右显示时间。每个进程和线程 — 单独的轨道。W/S键放大/缩小,A/D在时间中移动。用鼠标选择区域以放大部分。VSync线显示帧边界(60 FPS时每16.6毫秒)。如果两条VSync线之间无法容纳完整的渲染周期 — 帧已丢失。注意SurfaceFlinger轨道:如果长时间忙碌(橙色块),意味着图层合成正在减慢整体渲染。
报告左侧的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引起。
Perfetto 是Systrace的继任者,由Google在Android 9(Pie)中作为实验性工具引入,并从Android 12开始成为主要工具。Perfetto使用现代protobuf数据格式,支持长时间会话(小时而非秒),并具有用于查看追踪的Web UI。让我们分析两个系统之间的关键差异。
| 标准 | Systrace | Perfetto |
|---|---|---|
| 格式 | HTML报告(trace.html) | Protobuf(.trace / .perfetto-trace) |
| 持续时间 | 最多60秒 | 小时,千兆字节数据 |
| 界面 | 内置HTML | Web UI(ui.perfetto.dev) |
| 类别 | 固定(ftrace + atrace) | 可扩展(对追踪进行SQL查询) |
| 可移植性 | 仅Android | Android、Linux、Chrome、Windows |
尽管过渡到Perfetto,使用Systrace的技能仍然相关:在Android 11之前的设备上默认使用,Perfetto保持与Systrace类别的向后兼容性。Android Studio CPU Profiler对新设备使用Perfetto,对旧设备使用Systrace — 对用户透明。对于CI/CD,建议使用Perfetto,因为其格式适合通过Python和SQL进行自动处理。
为了实际掌握Systrace,我们考虑两个场景:查找滚动时丢帧的原因和诊断频繁阻塞UI线程的GC。
使用gfx类别运行Systrace 10秒钟,在应用程序中滚动列表。在报告中找到红色帧的部分。点击问题帧并查看应用程序轨道 — 如果有“inflateLayout”或“onBindViewHolder”块宽度>16毫秒,问题出在布局膨胀或数据绑定上。解决方案:优化布局(减少ViewGroup深度,ViewStub),将图片加载移至Glide中的onAttachedToWindow。
使用freq和sched类别的Systrace可以查看GC周期驱逐UI线程的频率。在时间线上找到应用程序轨道 — 如果看到周期性的20–50毫秒持续时间的块,名称为“Concurrent GC”,意味着垃圾回收器工作太频繁。添加“dalvik”类别进行详细分析。解决方案:将Bitmap转换为ByteBuffer,使用对象池(ObjectPool)进行频繁分配,通过ART参数减少堆碎片。
# 使用类别运行以分析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
常见问题
可以,运行Systrace不需要root访问权限。该工具使用atrace,它在任何启用了USB调试的设备上都可用。某些类别(power,freq)可能需要系统签名,但基本类别(gfx,sched,input)在所有设备上都能工作。
60秒的限制与ftrace环形缓冲区的容量有关 — 长时间录制时缓冲区会被覆盖。Perfetto消除了这个限制:可以录制数小时,通过USB传输或流式写入磁盘获得大小达数千兆字节的追踪。
可能原因:应用程序未切换到debuggable模式,清单中未添加android:debuggable=”true”标志,或使用了release版本。还检查类别中是否指定了--app=com.example.app — 否则Systrace只捕获系统进程。
对于C++,使用libcutils库中的ATRACE_BEGIN和ATRACE_END。包含头文件并包裹所需部分。标记将出现在Systrace中您的进程轨道上,这对于分析游戏引擎(Unity,Unreal)特别有用。
在Android 12及更高版本上,使用Perfetto。通过ADB在设备上安装perfetto代理,以JSON格式开始录制。快速查看使用Perfetto Web UI(ui.perfetto.dev),CI使用Python的TraceProcessor进行命令导出。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。