本篇是 Perfetto 系列文章的第四篇,如何使用 trace_processor_shell 在本地打开超过 2G 的大文件。在实际的问题分析过程中,我们经常会碰到非常大的 Trace 文件(大于 2GB),直接扔进 ui.perfetto.dev 是没法打开的,这是因为浏览器内存的限制。这时候我们就需要使用官方提供的 trace_processor_shell 工具来本地打开大文件。
随着 Google 宣布 Systrace 工具停更,推出 Perfetto 工具,Perfetto 在我的日常工作中已经基本能取代 Systrace 工具。同时 Oppo、Vivo 等大厂也已经把 Systrace 切换成了 Perfetto,许多新接触 Android 性能优化的小伙伴对于 Perfetto 那眼花缭乱的界面和复杂的功能感觉头疼,希望我能把之前的那些 Systrace 文章使用 Perfetto 来呈现。
Paul Graham 说:要么给大部分人提供有点想要的东西,要么给小部分人提供非常想要的东西。Perfetto 其实就是小部分人非常想要的东西,那就开始写吧,欢迎大家多多交流和沟通,发现错误和描述不准确的地方请及时告知我,我会及时修改,以免误人子弟。
本系列旨在通过 Perfetto 这个工具,从一个新的视角审视 Android 系统的整体运作方式。此外,它还旨在提供一个不同的角度来学习 App 、 Framework、Linux 等关键模块。尽管你可能已经阅读过许多关于 Android Framework、App 、性能优化的文章,但或许因为难以记住代码或不明白其运行流程,你仍感到困惑。通过 Perfetto 这个图形化工具,你可能会获得更深入的理解。
Perfetto 系列目录
- Android Perfetto 系列目录
- Android Perfetto 系列 1:Perfetto 工具简介
- Android Perfetto 系列 2:Perfetto Trace 抓取
- Android Perfetto 系列 3:熟悉 Perfetto View
- Android Perfetto 系列 4:使用命令行在本地打开超大 Trace
- 视频(B站) - Android Perfetto 基础和案例分享
如果大家还没看过 Systrace 系列,下面是传送门:
- Systrace 系列目录 : 系统介绍了 Perfetto 的前身 Systrace 的使用,并通过 Systrace 来学习和了解 Android 性能优化和 Android 系统运行的基本规则。
- 个人博客 :个人博客,主要是 Android 相关的内容,也放了一些生活和工作相关的内容。
欢迎大家在 关于我 页面加入微信群或者星球,讨论你的问题、你最想看到的关于 Perfetto 的部分,以及跟各位群友讨论所有 Android 开发相关的内容
0. trace_processor_shell 工具下载
官方下载地址:https://github.com/google/perfetto/releases ,找到最新的 release 版本,选择自己的平台下载即可:
下载之后里面就会有 trace_processor_shell 工具(以 Mac 平台为例)
trace_processor_shell 是 Perfetto 开源项目的核心工具之一,提供高性能的本地 Trace 解析服务。通过 –httpd 参数启动 HTTP 服务器后,它允许:
- 本地原生加速:绕过浏览器 WASM 的性能限制,直接调用 C++ 实现的解析引擎。基于 Rust/C++ 混合实现的解析引擎,优化了内存布局和并行处理,支持流式解析超大型 trace 文件。
- 交互式分析:与 Perfetto UI 深度集成,支持动态查询和可视化。
- 离线调试:无需上传 trace 到云端,保护隐私并支持内网环境。
其他的参数
参数 | 作用 | 示例值 |
---|---|---|
--http-port |
指定监听端口 | --httpd :8080 |
--preload |
预加载常用数据表 | --preload sched |
--num-threads |
设置解析线程数(默认 CPU 核数) | --num-threads 8 |
1. 使用 trace_processor_shell 打开 Trace 大文件
./trace_processor_shell –httpd ../jank-航旅纵横-火车票-上下滑动超级卡顿.perfetto-trace
这时候在网页端打开 https://ui.perfetto.dev ,会有下面的弹框
弹框选项功能详解如下
1. YES, use loaded trace
- 功能:直接复用当前 Trace Processor 已加载的 trace 文件状态(即命令行中指定的
../jank-航旅纵横-火车票-上下滑动超级卡顿.perfetto-trace
)。 - 适用场景:
若你已通过trace_processor_shell --httpd
加载了 trace 文件,且希望 UI 直接使用当前进程的解析状态(包括已执行的 SQL 查询、过滤条件等),选择此选项。 - 优势:
避免重复解析文件,节省时间和内存。
2. YES, but reset state
- 功能:强制重置 Trace Processor 状态,重新加载当前 trace 文件(或加载新文件)。
- 适用场景:
- 需要清除当前 Trace Processor 的所有状态(如临时查询结果、过滤器等),重新开始分析。
- 想通过同一端口加载另一个 trace 文件(需先停止当前进程或更换端口)。
- 等效操作:
等同于关闭当前trace_processor_shell
进程后重新执行命令。
3. NO, Use builtin WASM
- 功能:完全绕过本地 Trace Processor 服务,改用浏览器内置的 WebAssembly (WASM) 引擎解析 trace 文件。
- 适用场景:
- 本地 Trace Processor 服务不可用或存在兼容性问题。
- 需要支持分享链接、下载修改后的 trace 文件等 WASM 模式专属功能。
- 代价:
大文件(如 >100MB)解析速度显著下降,且可能因浏览器内存限制崩溃。
如果选择 YES, use loaded trace , 打开 Trace 后,下面这几个功能是不可用的
2. 命令行启动 vs 直接打开 UI 的区别
通过命令行启动 (trace_processor_shell --httpd
)
- 核心机制:
本地启动一个高性能的 C++ Trace Processor 服务(监听127.0.0.1:9001
),提供原生加速的 trace 解析能力。 - 优势:
- 性能:原生代码解析速度远超 WASM,尤其适合大型 trace 文件(如 >100MB)。
- 功能扩展性:支持 SQL 查询、自定义指标计算等高级功能。
- 状态保持:Trace Processor 的解析状态(如 SQL 临时表)可跨页面会话保留。
- 限制:
- 无法直接通过 UI 分享 trace 文件链接或下载修改后的文件。
- 同一时间仅允许一个浏览器标签页使用加速服务。
直接打开 UI 网页 (ui.perfetto.dev
)
- 核心机制:
完全依赖浏览器内置的 WebAssembly 引擎解析 trace 文件,无本地服务参与。 - 优势:
- 便捷性:无需安装或启动本地工具,适合快速查看小型 trace。
- 功能完整性:支持分享链接、下载修改后的 trace 文件等协作功能。
- 劣势:
- 性能瓶颈:WASM 解析速度慢,大文件可能导致浏览器卡顿或崩溃。
- 功能限制:不支持部分高级 SQL 查询和自定义分析功能。
总结建议
- 优先命令行启动:处理大型 trace 或需要复杂分析时,使用
trace_processor_shell --httpd
提升性能。 - 临时轻量分析:直接上传到
ui.perfetto.dev
更方便,但需注意文件大小限制。
3. Mac 权限问题
Mac 上直接运行 ./trace_processor_shell –httpd 会报下面的错误
需要在设置-隐私与安全,点击 Allow 才可以继续运行
参考文档
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球 : 欢迎加入,多谢支持~
一个人可以走的更快 , 一群人可以走的更远