Android Perfetto Profilers Skills 简明使用指南
本文简要介绍 GitHub
android/skills仓库中profilers目录下的两个 Perfetto 相关 Skill:perfetto-sql与perfetto-trace-analysis。重点说明它们从哪里来、分别解决什么问题、能做到什么程度,以及团队如何使用。
1. Skill 来源与定位
这两个 Skill 来自 GitHub 仓库:
text
https://github.com/android/skills/tree/main/profilers
该目录下包含两个子 Skill:
| Skill | 路径 | 核心定位 |
|---|---|---|
perfetto-sql |
profilers/perfetto-sql |
把自然语言查询需求转换成 Perfetto SQL,并用 trace_processor 执行 |
perfetto-trace-analysis |
profilers/perfetto-trace-analysis |
分析 Perfetto trace,定位 Android 应用 latency、memory、jank 等问题根因 |
两个 Skill 都围绕 Android Perfetto trace 分析 展开。
2. 适用场景:分别用来解决什么问题
2.1 perfetto-sql:面向"查数据"
perfetto-sql 的作用是:
把用户的自然语言数据查询需求,转换成合法的 Perfetto SQL,并在本地 trace 文件上执行。
它适合解决"我要查某个数据"的问题,例如:
- 查某个 slice 出现了多少次、总耗时多少;
- 查某个线程在某段时间是
Running、Runnable还是Sleeping; - 查某个 counter 的变化;
- 查 CPU frequency;
- 查 app startup 相关数据;
- 查 memory、thread、slice 等结构化信息。
它的重点不是直接给业务结论,而是 准确取数。
2.2 perfetto-trace-analysis:面向"找根因"
perfetto-trace-analysis 的作用是:
当用户提供 Perfetto trace,并提出启动慢、卡顿、jank、内存、功耗等问题时,按证据链逐步分析并定位根因。
它适合解决"为什么出问题"的问题,例如:
- 为什么应用启动慢;
- 为什么出现 jank;
- 为什么某段交互卡顿;
- 为什么内存异常;
- 为什么功耗偏高;
- 某个 trace 的主要性能瓶颈在哪里。
它会结合多个方向的分析线索:
- CPU;
- Graphics;
- I/O;
- IPC / Binder;
- Memory;
- Power。
它的重点是 基于证据链找根因。
3. 能力边界:能做什么、不能做什么
3.1 可以帮助我们做什么
这套 Skill 可以帮助团队做以下事情:
| 场景 | 推荐使用 |
|---|---|
| 明确查询某个 trace 数据 | perfetto-sql |
| 分析启动慢 | perfetto-trace-analysis |
| 分析 jank / 卡顿 | perfetto-trace-analysis |
| 分析线程是否真的在跑 CPU | perfetto-sql 或 perfetto-trace-analysis |
| 分析 Binder / I/O / Lock 等等待问题 | perfetto-trace-analysis |
| 分析内存、LMK、swap、dmabuf 等问题 | perfetto-trace-analysis |
| 分析功耗、wakelock、suspend 等问题 | perfetto-trace-analysis |
| 生成可复核的问题分析报告 | perfetto-trace-analysis |
3.2 可以做到什么程度
这套 Skill 的目标不是"凭经验猜原因",而是:
- 用
trace_processor执行真实查询; - 查询 Perfetto 标准库文档,确认表结构和字段;
- 通过 SQL / metrics 拿到证据;
- 用 scratchpad 记录 verified facts;
- 逐步判断线程是在运行、等 CPU、睡眠,还是被 I/O / Binder / Lock 等阻塞;
- 尽量沿着等待链追到 blocker;
- 输出可复核的分析结论。
3.3 需要注意的限制
需要注意:
- 如果 trace 没有采集某类数据,它不能凭空分析;
- hints 只是调查线索,不是直接结论;
- 长 slice 不等于 CPU 忙,必须结合
thread_state判断; - 最终结论必须来自实际查询结果和证据链;
- 它不能替代工程判断,但可以显著提高定位效率和结论可复核性。
4. 使用方法:如何选择与提问
4.1 使用前需要准备什么
建议提供以下信息:
- Perfetto trace 文件;
- 问题类型:启动慢 / jank / 卡顿 / 内存 / 功耗 / I/O;
- 目标 package name;
- 复现步骤;
- 关注时间点或时间窗口;
- 设备型号、系统版本、构建版本;
- 如果有对比样本,提供 good trace 和 bad trace。
4.2 如何选择 Skill
简单判断:
text
如果问题是"查什么数据" → 用 perfetto-sql
如果问题是"为什么出问题" → 用 perfetto-trace-analysis
示例:
| 用户问题 | 应使用 |
|---|---|
| "查一下 RenderThread 相关 slice 总耗时" | perfetto-sql |
| "查主线程在 10s~12s 之间的 thread_state" | perfetto-sql |
| "帮我分析这个 trace 为什么启动慢" | perfetto-trace-analysis |
| "这个卡顿是不是 Binder 导致的?" | perfetto-trace-analysis |
| "为什么内存涨了并触发 LMK?" | perfetto-trace-analysis |
4.3 perfetto-sql 提问模板
text
请使用 perfetto-sql 分析 trace:/path/to/xxx.perfetto-trace
查询目标:统计名称包含 RenderThread 的 slice 数量和总耗时
要求:
1. 先确认相关 schema
2. 给出最终 SQL
3. 使用 trace_processor 执行
4. 返回结果并解释
4.4 perfetto-trace-analysis 提问模板
text
请使用 perfetto-trace-analysis 分析 trace:/path/to/xxx.perfetto-trace
问题:应用启动慢
目标包名:com.example.app
复现步骤:点击桌面图标后进入首页
关注区间:点击图标到首页首帧完成
希望输出:
1. 关键时间线
2. 可疑进程/线程/slice
3. thread_state 证据
4. 如果线程等待,请继续追 blocker
5. 是否存在其他主要瓶颈
6. 根因结论和优化建议
7. scratchpad 文件路径
5. 分析示例:启动慢问题如何展开
下面是使用 perfetto-trace-analysis 分析启动慢问题时,一个合理的展开方式。
scratchpad trace_processor Agent 用户 scratchpad trace_processor Agent 用户 提供 trace,并说明"启动慢" 创建 xxx_analysis.md 记录证据链 阅读 CPU/Graphics/IO/IPC/Memory/Power hints 运行 android_startup metrics 返回启动阶段指标 查询启动 package 和启动时间窗口 返回 startup 相关数据 查询主线程、RenderThread 等关键线程长 slice 返回可疑 slice 查询可疑时间段 thread_state 判断线程是在 Running / Runnable / Sleeping / D-state 如果线程在等待,继续追 Binder / Lock / I/O / 其他 blocker 记录 verified facts 输出根因分析、证据链和优化建议
一个典型分析思路:
-
确定目标应用和启动区间
如果用户没有给 package,需要先从 startup 数据中识别候选 package。
-
查看高层 metrics
例如启动耗时、启动阶段、主要长耗时区间。
-
定位关键线程和可疑 slice
重点关注主线程、RenderThread,以及启动路径上的长 slice。
-
查询 thread_state,区分"运行慢"还是"等待慢"
如果是
Running,可能是 CPU 计算或执行耗时;如果是
Runnable,可能是等 CPU 调度;如果是
Sleeping,可能是在等锁、Binder 或其他事件;如果是 D-state,可能与 I/O 或 kernel block 相关。
-
如果是等待,继续追 blocker
不能停留在"主线程卡住了",要继续看它等的是 Binder、锁、I/O,还是其他线程/进程。
-
排查是否还有其他主要瓶颈
找到一个异常后,不应立即结束,需要检查是否还有独立的 CPU、I/O、Memory、Graphics 等问题。
-
输出结论和证据链
最终报告应包含:关键证据、时间线、可疑线程、根因判断、优化建议和 scratchpad 路径。
6. 总结:这套 Skill 的价值
perfetto-sql 和 perfetto-trace-analysis 可以理解为一套组合工具:
| Skill | 价值 |
|---|---|
perfetto-sql |
帮我们可靠地从 Perfetto trace 中查数据 |
perfetto-trace-analysis |
帮我们基于证据链分析性能问题根因 |
它们的核心意义是:
- 降低 Perfetto trace 分析门槛;
- 避免凭经验猜测;
- 让 SQL 查询和根因分析过程可复核;
- 帮助测试、QA、开发围绕同一份证据链协作;
- 适合用于 Android 启动慢、卡顿、jank、内存、功耗等问题定位。
一句话总结:
perfetto-sql负责"查清楚数据",perfetto-trace-analysis负责"基于数据和证据链找根因"。