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

580 阅读5分钟

本篇是 Perfetto 系列文章的第四篇,如何使用 trace_processor_shell 在本地打开超过 2G 的大文件。在实际的问题分析过程中,我们经常会碰到非常大的 Trace 文件(大于 2GB),直接扔进 ui.perfetto.dev 是没法打开的,这是因为浏览器内存的限制。这时候我们就需要使用官方提供的 trace_processor_shell 工具来本地打开大文件。

本系列旨在通过 Perfetto 这个工具,从一个新的视角审视 Android 系统的整体运作方式。此外,它还旨在提供一个不同的角度来学习 App 、 Framework、Linux 等关键模块。尽管你可能已经阅读过许多关于 Android Framework、App 、性能优化的文章,但或许因为难以记住代码或不明白其运行流程,你仍感到困惑。通过 Perfetto 这个图形化工具,你可能会获得更深入的理解。

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. 视频(B站) - Android Perfetto 基础和案例分享

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

  1. Systrace 系列目录 : 系统介绍了 Perfetto 的前身 Systrace 的使用,并通过 Systrace 来学习和了解 Android 性能优化和 Android 系统运行的基本规则。
  2. 个人博客 :个人博客,主要是 Android 相关的内容,也放了一些生活和工作相关的内容。

欢迎大家在 关于我 页面加入微信群或者星球,讨论你的问题、你最想看到的关于 Perfetto 的部分,以及跟各位群友讨论所有 Android 开发相关的内容

0. trace_processor_shell 工具下载

官方下载地址:github.com/google/perf… ,找到最新的 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

这时候在网页端打开 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 才可以继续运行

以下是关于 trace_processor_shell --httpd 的深度功能介绍,适合作为技术文章的核心内容: