本篇是 Perfetto 系列文章的第四篇,如何使用 trace_processor_shell 在本地打开超过 2G 的大文件。在实际的问题分析过程中,我们经常会碰到非常大的 Trace 文件(大于 2GB),直接扔进 ui.perfetto.dev 可能会因浏览器内存限制而打不开;这里的限制是解析时的内存占用,并不是文件超过 2GB 就一定打不开。这时候我们就可以使用官方提供的 trace_processor_shell 工具来本地打开大文件。
写下这个系列时,Perfetto 在我的日常工作中已经基本取代 Systrace,我接触到的 OPPO、vivo 团队也在迁移。许多刚做 Android 性能优化的小伙伴觉得 Perfetto 界面眼花缭乱、功能复杂,希望我能把之前的 Systrace 文章用 Perfetto 再讲一遍。
版本说明(2026-10 核查):原截图使用 v49 的
trace_processor_shell。本次官方trace_processor下载脚本指向 v58.2;命令按该版本核对,UI 行为对照 v58.3 源码。server http是当前子命令写法,旧--httpd仍受支持;文件名叫trace_processor_shell本身不表示工具废弃。两种写法见下文,更多 SQL 用法见系列 11。
本文目录
- Perfetto 系列目录
- 0. trace_processor_shell 工具下载
- 1. 使用 trace_processor_shell 打开 Trace 大文件
- 2. 命令行启动 vs 直接打开 UI 的区别
- 3. Mac 权限问题
- 参考文档
- 关于我 && 博客
Paul Graham 说:要么给大部分人提供有点想要的东西,要么给小部分人提供非常想要的东西。Perfetto 其实就是小部分人非常想要的东西,那就开始写吧,欢迎大家多多交流和沟通,发现错误和描述不准确的地方请及时告知我,我会及时修改,以免误人子弟。
我想借这个系列,和大家一起对照 Perfetto 看 App、Framework、Linux 是怎么配合起来运行的。如果读过不少源码和性能文章,还是记不住流程,不妨把代码放回 Trace 的时间线上看看。
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 调度与锁竞争
- Android Perfetto 系列 11:PerfettoSQL、Trace Processor 与回归检测
- Android Perfetto 系列 12:Trace 数据流与丢失排查
- Android Perfetto 系列 13:Perfetto SDK、Track Event 与 App 现场 Trace
- Android Perfetto 系列 14:heapprofd 与内存 Profiling
- Android Perfetto 系列 15:Boot Trace、长时间现场 Trace 与偶发问题抓取
- Android Perfetto 系列 16:GPU、Power Counters 与硬件瓶颈分析
- Android Perfetto 系列 17:专项场景自动化、问题清单与平台体系
- Android Perfetto 系列 18:响应速度实战,从输入事件到首帧反馈
- 视频(B站) - Android Perfetto 基础和案例分享
- 视频(B站) - Android Perfetto 分享 - 出图类型分享:AOSP、WebView、Flutter + OEM 系统优化分享
如果大家还没看过 Systrace 系列,下面是传送门:
- Systrace 系列目录 : 系统介绍了 Perfetto 的前身 Systrace 的使用,并通过 Systrace 来学习和了解 Android 性能优化和 Android 系统运行的基本规则。
- 个人博客 :个人博客,主要是 Android 相关的内容,也放了一些生活和工作相关的内容。
欢迎大家在 关于我 页面查看交流方式,讨论你的问题、你最想看到的关于 Perfetto 的部分,以及跟各位群友讨论所有 Android 开发相关的内容
0. trace_processor_shell 工具下载
可从 官方 Releases 下载与运行电脑的系统/架构匹配的压缩包,例如 Apple Silicon 选择 mac-arm64。下面两张是 v49 历史截图,包名和内容以选定 release 为准;不要把 Android 设备包当作 macOS/Linux 主机工具。


macOS/Linux 也可使用官方 Python 3 包装脚本(需要 curl)。首次运行按脚本内清单下载原生可执行文件并校验 SHA-256,之后使用缓存;脚本内清单决定原生版本,已缓存的工具不会每次自动更新到最新版,应记录 --version 输出。以下命令在存放工具的目录执行:
1 | curl -fLO https://get.perfetto.dev/trace_processor |
解析仍由原生 Trace Processor 完成,UI 通过本地 RPC 查询。它绕过浏览器中解析引擎的内存上限,但仍受本机 RAM、地址空间和查询中间结果约束,不能无限流式解析。默认本地打开 trace 不会上传原文件;完全离线还需要提前准备二进制及可离线使用/本地部署的 UI,不能只启动 HTTP 服务就认为网页已离线可用。
参数要区分新旧命令形式(v58.2):
| 用途 | 子命令形式 | 旧平铺参数 |
|---|---|---|
| HTTP 服务 | server http --port 9001 "trace.pftrace" |
--httpd --http-port 9001 "trace.pftrace" |
| 执行 SQL 文件 | query -f query.sql "trace.pftrace" |
-q query.sql "trace.pftrace" |
| 强制完整排序 | 全局 --full-sort |
--full-sort |
表中省略了前面的 ./trace_processor 或原生二进制名。不要把旧 -q 直接搬进新的 query 子命令,后者用 -f/--query-file。--full-sort 可能增加峰值内存,不是打开大文件的通用加速开关。自定义端口还需要 UI 的 rpc_port 和页面连接策略匹配,默认 9001 最简单;参见官方大 Trace 指南和 CLI 参数。
1. 使用 trace_processor_shell 打开 Trace 大文件
使用包装脚本时,当前写法如下。把引号中的路径换成实际文件;服务保持运行,浏览器才能继续查询:
1 | ./trace_processor server http "../trace-file.perfetto-trace" |
原 v49 下载包仍用下面的旧写法;这里只需选择一种,不要把两个进程同时启动到默认端口:
1 | ./trace_processor_shell --httpd "../trace-file.perfetto-trace" |

原终端截图显示 Address already in use,IPv4/IPv6 的 9001 监听均失败,不是本次进程启动成功的证明。若已有自己的 Trace Processor,可连接并确认它载入的文件;否则先正常停止自己不再需要的实例再重试,不要误结束其他分析任务。
确认文件加载和服务监听成功后打开 Perfetto UI。UI 会探测本机 9001,再通过 WebSocket RPC 查询;版本不匹配时可能先提示切换到匹配 UI 或更新本地工具。若没有发现服务,检查终端错误、端口和浏览器本地网络访问限制。下面的预加载 trace 弹框是旧截图,不保证每次都会出现:

弹框选项功能详解
1. YES, use loaded trace
复用服务进程已解析的 trace,省去重新读取/解析原文件。它不等于恢复上一页的筛选、选区、标记或所有 SQL 临时对象:v58.3 UI 的预加载路径会调用 restoreInitialTables(),将 SQL 环境恢复到初始状态,再初始化 UI。要复用的是已导入的数据,不是完整分析会话。
2. YES, but reset state
继续使用本地服务,但进入从 UI 打开其他 trace 的流程,不自动重读命令行中原来的文件。v58.3 中按钮选择本身不会重启进程;之后导入新数据时,RPC 会在旧 trace 已结束的状态下重置解析器。无需为了每次换文件都杀进程或改端口,但旧解析状态会被替换。
同一个服务按一个活动 trace/单个 UI 客户端使用,避免另一个页面的重置或查询影响正在做的分析。
3. NO, Use builtin WASM
当前标签页改用浏览器内置 WASM 引擎,需要在 UI 中选择/提供文件;不会把本地服务里的已解析数据自动搬进浏览器,也不会停止该服务。SQL 查询并非原生模式专属,两种引擎都支持。
下面的旧截图展示预加载 RPC trace 的下载/转换限制。v58.3 UI 根据是否持有可下载的原始来源判断能力:纯 HTTP_RPC 预加载没有文件字节,不能直接下载或转换;由 UI 打开的文件则是另一种来源,不能一概说“所有原生模式都禁用”。下载的原始 trace 也不是把筛选或 SQL 结果写回后的“修改版 trace”。分享是否可用还受来源和部署影响,开启分享可能上传文件/状态,不是切换 WASM 就自动得到所有协作功能。加载实现

2. 命令行启动 vs 直接打开 UI 的区别
通过命令行启动 (trace_processor_shell --httpd)
本地原生进程负责解析和 SQL,默认监听 localhost:9001(UI 从 127.0.0.1:9001 探测),浏览器负责界面和渲染。它通常更适合大文件,但总耗时仍取决于数据量、类型、机器内存和查询;UI 本身仍会占用浏览器内存。
服务活着可以复用已导入的数据;进程退出、加载新 trace 或 UI 初始化 SQL 状态会影响复用范围。保留重要查询脚本和原文件,不要依赖跨页面保留临时表。直接用预加载 RPC 时,原文件下载/转换受上一节所述限制。
直接打开 UI 网页 (ui.perfetto.dev)
这里特指使用内置 WASM 引擎打开文件。访问同一个网页也可以连接原生服务,所以“网页”和“命令行”并不是两个互斥的 UI。
WASM 无需另起本地进程,也能执行 PerfettoSQL 和可视化。正常打开本地文件不需要上传;能否下载/分享取决于输入来源和部署。运行内存与文件大小不同,2 GB 是常见限制的历史参考值,不是所有浏览器的统一文件阈值;解析膨胀、查询结果和 UI 都可能增加内存。没有针对同一 trace 的测量,不把“WASM 一定更慢”当作结论。
总结建议
大文件解析碰到浏览器内存上限时,优先尝试原生服务;普通临时分析用 WASM 更省准备步骤。若原生进程也内存不足,需要检查导入/查询开销,或在后续采集时缩小范围和时长,而不是认为换命令就能打开任意大小文件。
3. Mac 权限问题
直接下载的可执行文件可能触发 Gatekeeper,下面是 v49 时期的提示,并非每台 Mac 运行该命令都会报错。先区分“无法验证开发者/未公证”、文件损坏/恶意软件提示、缺执行权限和架构不匹配,不能都按同一种权限问题处理。

对已确认来自官方且未被篡改的文件,按 Apple 官方说明,先尝试打开,再到“系统设置 → 隐私与安全性”,对该文件选择“仍要打开 / Open Anyway”,并确认后续提示。旧图中的按钮文字可能不同。这是对单个可信文件的例外,不是要求关闭系统安全检查;若提示损坏或恶意软件,应回到官方来源核查,不沿用这一步。

参考文档
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球 : 历史介绍(已停止运营)
一个人可以走的更快 , 一群人可以走的更远
