EN

Android Perfetto 系列 4:使用命令行在本地打开超大 Trace

字数统计: 3.1k阅读时长: 11 min
2025/02/08
loading

本篇是 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。

本文目录

Paul Graham 说:要么给大部分人提供有点想要的东西,要么给小部分人提供非常想要的东西。Perfetto 其实就是小部分人非常想要的东西,那就开始写吧,欢迎大家多多交流和沟通,发现错误和描述不准确的地方请及时告知我,我会及时修改,以免误人子弟。

我想借这个系列,和大家一起对照 Perfetto 看 App、Framework、Linux 是怎么配合起来运行的。如果读过不少源码和性能文章,还是记不住流程,不妨把代码放回 Trace 的时间线上看看。

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. Android Perfetto 系列 11:PerfettoSQL、Trace Processor 与回归检测
  13. Android Perfetto 系列 12:Trace 数据流与丢失排查
  14. Android Perfetto 系列 13:Perfetto SDK、Track Event 与 App 现场 Trace
  15. Android Perfetto 系列 14:heapprofd 与内存 Profiling
  16. Android Perfetto 系列 15:Boot Trace、长时间现场 Trace 与偶发问题抓取
  17. Android Perfetto 系列 16:GPU、Power Counters 与硬件瓶颈分析
  18. Android Perfetto 系列 17:专项场景自动化、问题清单与平台体系
  19. Android Perfetto 系列 18:响应速度实战,从输入事件到首帧反馈
  20. 视频(B站) - Android Perfetto 基础和案例分享
  21. 视频(B站) - Android Perfetto 分享 - 出图类型分享:AOSP、WebView、Flutter + OEM 系统优化分享

如果大家还没看过 Systrace 系列,下面是传送门:

  1. Systrace 系列目录 : 系统介绍了 Perfetto 的前身 Systrace 的使用,并通过 Systrace 来学习和了解 Android 性能优化和 Android 系统运行的基本规则。
  2. 个人博客 :个人博客,主要是 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
2
3
curl -fLO https://get.perfetto.dev/trace_processor
chmod +x ./trace_processor
./trace_processor --version

解析仍由原生 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”,并确认后续提示。旧图中的按钮文字可能不同。这是对单个可信文件的例外,不是要求关闭系统安全检查;若提示损坏或恶意软件,应回到官方来源核查,不沿用这一步。

配图

参考文档

  1. Perfetto Github 库
  2. Perfetto 官方文档

关于我 && 博客

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

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

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

微信扫一扫

CATALOG
  1. 1. 本文目录
  • Perfetto 系列目录
  • 0. trace_processor_shell 工具下载
  • 1. 使用 trace_processor_shell 打开 Trace 大文件
    1. 1. 弹框选项功能详解
      1. 1.1. 1. YES, use loaded trace
      2. 1.2. 2. YES, but reset state
      3. 1.3. 3. NO, Use builtin WASM
  • 2. 命令行启动 vs 直接打开 UI 的区别
    1. 1. 通过命令行启动 (trace_processor_shell --httpd)
    2. 2. 直接打开 UI 网页 (ui.perfetto.dev)
    3. 3. 总结建议
  • 3. Mac 权限问题
  • 参考文档
  • 关于我 && 博客