adb shell perfetto 抓取 trace 指令详解:一条命令快速搞懂
前言
在 Android 性能分析中,Perfetto 是非常常用的系统级 tracing 工具。
很多同学在排查 卡顿、掉帧、启动慢、Binder 调用异常、CPU 调度问题 时,都会用它来抓取 trace。
下面这条命令就是一个典型的抓取方式:
bash
adb shell "perfetto -o /data/misc/perfetto-traces/edit_export.perfetto-trace -t 10s -b 64mb --app com.example.phototurbodemo sched freq idle am wm gfx view binder_driver hal res dalvik bionic power pm ss database disk mmc"; adb pull /data/misc/perfetto-traces/edit_export.perfetto-trace .
本文就来拆解一下这条命令的含义,帮助你快速看懂并学会自己改。
一、这条命令整体在做什么?
这条命令其实分成两部分:
bash
adb shell "perfetto ..."
adb pull /data/misc/perfetto-traces/edit_export.perfetto-trace .
核心作用是:
- 在
Android设备上抓取 10 秒系统trace - 把生成的
trace文件拉到电脑当前目录
也就是说,它完成的是一个完整流程:
设备上采集
trace→ 保存到手机指定路径 → 拉取到本地分析
二、第一部分:adb shell perfetto 抓取 trace
原始命令如下:
bash
adb shell "perfetto -o /data/misc/perfetto-traces/edit_export.perfetto-trace -t 10s -b 64mb --app com.example.phototurbodemo sched freq idle am wm gfx view binder_driver hal res dalvik bionic power pm ss database disk mmc"
下面逐项拆开。
1. adb shell
bash
adb shell
表示进入设备 shell 环境执行命令。
也就是告诉电脑:后面的 perfetto 命令不是在本机执行,而是在 Android 手机里执行。
2. perfetto
bash
perfetto
这是 Android 平台上的 tracing 工具,用来采集系统和应用运行时的性能数据。
它可以记录很多信息,比如:
CPU调度- 频率变化
Binder调用- 图形渲染
Activity/Window状态- 内存与磁盘相关事件
3. -o:输出文件路径
bash
-o /data/misc/perfetto-traces/edit_export.perfetto-trace
表示 trace 输出到设备上的这个文件:
bash
/data/misc/perfetto-traces/edit_export.perfetto-trace
这里有两个关键点:
/data/misc/perfetto-traces/:Perfetto常用的trace存放目录edit_export.perfetto-trace:输出文件名,可以自定义
也就是说,抓取结束后,trace 文件会先保存在手机里,而不是直接到电脑上。
4. -t 10s:抓取时长
bash
-t 10s
表示采集时长为 10 秒。
常见写法有:
-t 5s:抓 5 秒-t 10s:抓 10 秒-t 30s:抓 30 秒
如果你要分析某个具体操作,比如:
- 点击按钮
- 页面切换
- 图片导出
- 应用启动
通常可以设置成 5~15 秒,够看核心过程即可。
5. -b 64mb:buffer 大小
bash
-b 64mb
表示 trace buffer 的大小是 64MB。
这个参数决定 Perfetto 采集数据时使用多大的缓冲区。
如果 buffer 太小,在事件很多的时候,可能会出现:
- 旧数据被覆盖
- trace 不完整
- 关键信息丢失
一般来说:
- 轻量场景:
16mb/32mb - 常规场景:
64mb - 重负载场景:
128mb甚至更大
这条命令设置 64mb,属于比较常见、比较稳妥的配置。
6. --app com.example.phototurbodemo:关注指定应用
bash
--app com.example.phototurbodemo
表示此次 trace 重点关联这个应用进程:
bash
com.example.phototurbodemo
它的作用一般是:
- 让
app相关的trace信息更明确 - 便于聚焦某个目标应用
- 分析该应用主线程、渲染、调度、
Binder等行为
如果你要分析别的应用,改成对应包名即可。
例如:
bash
--app com.xxx.yyy
三、后面这一长串是什么?
后面这一串:
bash
sched freq idle am wm gfx view binder_driver hal res dalvik bionic power pm ss database disk mmc
可以理解为:
告诉 Perfetto:要抓哪些类别的数据源。
这些都是 trace category(追踪类别)或相关事件类型。
下面简要说明每一项的核心作用。
1. sched
bash
sched
抓取 线程调度 信息。
能看到:
- 线程什么时候运行
- 被哪个
CPU执行 - 什么时候被切走
- 是否发生抢占
这是分析 卡顿、主线程阻塞、线程竞争 时最核心的数据之一。
2. freq
bash
freq
抓取 CPU 频率变化。
用于看:
CPU是否升频- 性能是否被拉满
- 调度和频率是否匹配
适合分析性能不足或功耗问题。
3. idle
bash
idle
抓取 CPU 空闲状态。
可以辅助判断:
CPU是否长期空闲- 是否存在
workload不连续 - 功耗状态切换情况
4. am
bash
am
即 ActivityManager 相关事件。
主要用于看:
Activity/Service生命周期- 进程管理
- 应用切换相关行为
适合分析启动、页面切换、前后台切换。
5. wm
bash
wm
即 WindowManager 相关事件。
主要用于观察:
- 窗口切换
- 窗口层级变化
- 界面显示流程
6. gfx
bash
gfx
抓取 图形渲染 相关信息。
通常用于分析:
- 掉帧
- 渲染卡顿
- 绘制性能问题
7. view
bash
view
抓取 View 系统 相关事件。
比如:
measure/layout/draw- UI 线程的 View 绘制行为
适合排查传统 View 界面的卡顿问题。
8. binder_driver
bash
binder_driver
抓取 Binder 驱动层调用。
非常适合分析:
- 进程间通信耗时
Binder调用阻塞system_server或其他服务交互异常
如果应用依赖系统服务很多,这类数据很有价值。
9. hal
bash
hal
抓取 硬件抽象层(HAL) 相关信息。
用于观察系统与底层硬件模块交互情况,比如:
- 相机
- 音频
- 显示
- 传感器
10. res
bash
res
通常和 资源加载/系统资源相关行为 有关。
在具体分析中,更多是辅助信息。
11. dalvik
bash
dalvik
抓取 *Android Runtime / Java 虚拟机* 相关事件。
比如:
GC- 线程状态
Java层运行时活动
如果怀疑 Java/Kotlin 层频繁 GC 或运行时抖动,这类信息很关键。
12. bionic
bash
bionic
抓取 *Bionic libc* 相关事件。
更多偏底层运行库行为,适合做更深入的系统问题分析。
13. power
bash
power
抓取 电源管理 相关事件。
可以辅助分析:
- 唤醒行为
- 功耗状态
- 电源相关调度影响
14. pm
bash
pm
即 PackageManager / PowerManager 相关部分事件 ,具体视平台实现而定。
一般作为辅助分析项使用。
15. ss
bash
ss
通常表示系统服务相关 tracing 类别中的一部分,具体内容可能因 Android 版本和设备厂商而略有差异。
实际使用中,它更多是补充系统服务行为信息。
16. database
bash
database
抓取 数据库操作 相关事件。
如果你的应用存在:
SQLite查询慢- 主线程读写数据库
- 数据库锁竞争
这个类别会很有帮助。
17. disk
bash
disk
抓取 磁盘 I/O 相关信息。
可以分析:
- 文件读写耗时
I/O阻塞- 导出、解码、加载资源时的磁盘压力
18. mmc
bash
mmc
抓取 存储设备(MMC/UFS 等块设备) 相关事件。
更偏底层存储链路分析,适合深挖 I/O 性能问题。
四、第二部分:adb pull 拉取 trace 文件
第二段命令:
bash
adb pull /data/misc/perfetto-traces/edit_export.perfetto-trace .
表示把设备上的 trace 文件拉到电脑当前目录。
拆解如下:
1. adb pull
bash
adb pull
用于从 Android 设备拷贝文件到本地电脑。
2. 源文件路径
bash
/data/misc/perfetto-traces/edit_export.perfetto-trace
就是前面 -o 指定生成的 trace 文件。
3. .
bash
.
表示拉到当前命令行所在目录。
所以最终效果是:
手机上的
edit_export.perfetto-trace被下载到你电脑当前目录下
五、整条命令的执行流程
这条命令完整执行流程可以概括为:
第一步:在设备上抓取 10 秒 trace
- 输出文件:
/data/misc/perfetto-traces/edit_export.perfetto-trace - 目标应用:
com.example.phototurbodemo - 采集类别:调度、频率、渲染、Binder、数据库、磁盘等
第二步:把 trace 拉到本地
- 文件保存到当前目录
- 后续可用 Perfetto UI 打开分析
六、这条命令适合什么场景?
这条命令属于一个比较综合型的抓取方案,适合:
- 分析页面卡顿
- 分析图片编辑/导出耗时
- 分析应用主线程阻塞
- 分析 Binder 调用慢
- 分析磁盘
I/O或数据库操作影响 - 分析渲染掉帧
尤其从文件名 edit_export.perfetto-trace 来看,
它很像是在分析 图片编辑导出流程 的性能问题。
七、如果只看核心,最重要的是哪几个参数?
如果你只想快速记住核心,那就记这几个:
bash
perfetto -o <输出文件> -t <时长> -b <buffer大小> --app <包名> <trace类别...>
也就是:
-o:输出到哪里-t:抓多久-b:buffer 多大--app:抓哪个应用- 后面的类别:抓哪些信息
这几个就是整条命令最关键的骨架。
八、一个更易懂的口语化理解
你可以把这条命令理解成一句话:
让手机用 Perfetto 盯着
com.example.phototurbodemo这个应用,连续记录 10 秒内的线程调度、CPU 频率、渲染、Binder、数据库、磁盘等性能数据,保存成 trace 文件,然后把这个文件下载到电脑上分析。
九、总结
最后做一个简要总结:
这条命令的作用是:
- 在
Android设备上抓10秒性能trace - 重点关注指定应用
com.example.phototurbodemo - 采集调度、渲染、Binder、数据库、磁盘等关键性能信息
- 抓完后自动拉到本地当前目录
一句话总结:
这是一条用于 应用性能分析 / 卡顿定位 / 导出耗时排查 的综合
Perfetto抓取命令。
十、附:原命令
bash
adb shell "perfetto -o /data/misc/perfetto-traces/edit_export.perfetto-trace -t 10s -b 64mb --app com.example.phototurbodemo sched freq idle am wm gfx view binder_driver hal res dalvik bionic power pm ss database disk mmc"; adb pull /data/misc/perfetto-traces/edit_export.perfetto-trace .