Android Perfetto Profilers Skills 简明使用指南

Android Perfetto Profilers Skills 简明使用指南

本文简要介绍 GitHub android/skills 仓库中 profilers 目录下的两个 Perfetto 相关 Skill:perfetto-sqlperfetto-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 出现了多少次、总耗时多少;
  • 查某个线程在某段时间是 RunningRunnable 还是 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-sqlperfetto-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 的目标不是"凭经验猜原因",而是:

  1. trace_processor 执行真实查询;
  2. 查询 Perfetto 标准库文档,确认表结构和字段;
  3. 通过 SQL / metrics 拿到证据;
  4. 用 scratchpad 记录 verified facts;
  5. 逐步判断线程是在运行、等 CPU、睡眠,还是被 I/O / Binder / Lock 等阻塞;
  6. 尽量沿着等待链追到 blocker;
  7. 输出可复核的分析结论。

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 输出根因分析、证据链和优化建议

一个典型分析思路:

  1. 确定目标应用和启动区间

    如果用户没有给 package,需要先从 startup 数据中识别候选 package。

  2. 查看高层 metrics

    例如启动耗时、启动阶段、主要长耗时区间。

  3. 定位关键线程和可疑 slice

    重点关注主线程、RenderThread,以及启动路径上的长 slice。

  4. 查询 thread_state,区分"运行慢"还是"等待慢"

    如果是 Running,可能是 CPU 计算或执行耗时;

    如果是 Runnable,可能是等 CPU 调度;

    如果是 Sleeping,可能是在等锁、Binder 或其他事件;

    如果是 D-state,可能与 I/O 或 kernel block 相关。

  5. 如果是等待,继续追 blocker

    不能停留在"主线程卡住了",要继续看它等的是 Binder、锁、I/O,还是其他线程/进程。

  6. 排查是否还有其他主要瓶颈

    找到一个异常后,不应立即结束,需要检查是否还有独立的 CPU、I/O、Memory、Graphics 等问题。

  7. 输出结论和证据链

    最终报告应包含:关键证据、时间线、可疑线程、根因判断、优化建议和 scratchpad 路径。


6. 总结:这套 Skill 的价值

perfetto-sqlperfetto-trace-analysis 可以理解为一套组合工具:

Skill 价值
perfetto-sql 帮我们可靠地从 Perfetto trace 中查数据
perfetto-trace-analysis 帮我们基于证据链分析性能问题根因

它们的核心意义是:

  • 降低 Perfetto trace 分析门槛;
  • 避免凭经验猜测;
  • 让 SQL 查询和根因分析过程可复核;
  • 帮助测试、QA、开发围绕同一份证据链协作;
  • 适合用于 Android 启动慢、卡顿、jank、内存、功耗等问题定位。

一句话总结:perfetto-sql 负责"查清楚数据",perfetto-trace-analysis 负责"基于数据和证据链找根因"。

相关推荐
Zhu75817 小时前
在k8s集群部署MySQL单实例,支持多个主流发行版
android·mysql·kubernetes
AFinalStone20 小时前
Android 7系统异常问题排查(四)Framework层(上)—System Server Watchdog
android·系统异常
宝杰X721 小时前
Android Room3 多平台数据库
android·数据库
huibin1478523691 天前
热缓解学习记录
android·学习
小田的博客1 天前
SAP MM 供应商银行主数据更新报错!message R1228!
android·java·服务器
一笑的小酒馆1 天前
Android智能猫砂盆视频加载慢卡顿问题分析
android
只会cv的小前端1 天前
七巧低代码服务端脚本使用方法
android·低代码·rxjava
1 天前
Android 自定义 View 实战:从零打造工业级全向摇杆控件(OmniJoystickView)
android·kotlin·自定义view·摇杆控件
雨白1 天前
深入理解 Kotlin 协程 (十一):以逸待劳,探秘 select 多路复用与并发安全策略
android·kotlin
hunterandroid1 天前
[Android 从零到一] Android 深度链接与 App Links:从 URI Scheme 到可验证的应用跳转
android