最近在优化一款电商App的启动速度时,发现一个棘手问题:手头的华为Mate40和小米11都没有开发者选项中的"系统跟踪"功能。这意味着无法通过常规方式获取.perfetto-trace文件进行性能分析。经过两天摸索,终于找到一套完整的ADB命令行解决方案,现在把完整流程分享给大家。
在开始之前,我们需要明确几个关键点。Perfetto作为Android 10+的官方性能分析工具,其核心优势在于:
注意:即使设备没有图形界面的系统跟踪选项,只要系统版本≥Android 10,都可通过ADB使用Perfetto
需要准备的软硬件环境:
bash复制# 基础环境检查命令
adb devices # 确认设备连接正常
adb shell getprop ro.build.version.release # 查看Android版本
对于大多数性能分析场景,轻量模式已经足够。它操作简单,语法类似传统的systrace,适合快速定位问题。
bash复制adb shell perfetto \
--time 20s \
--buffer 256mb \
--size 64mb \
--out /data/misc/perfetto-traces/trace.perfetto-trace \
sched/sched_switch sched/sched_wakeup am wm view
参数解析:
--time 20s:采集时长20秒--buffer 256mb:环形缓冲区大小--size 64mb:最大文件大小--out:输出文件路径根据不同的分析场景,推荐以下数据源组合:
| 分析目标 | 推荐数据源组合 |
|---|---|
| UI卡顿 | am wm view input gfx rs sched/sched_switch sched/sched_wakeup |
| 应用启动 | am wm view activity_resume sched/sched_switch binder_lock binder_transaction |
| 内存问题 | kmem/rss_stat kmem/ion_heap_grow kmem/lowmemory_kill |
| 电池耗电 | power/cpu_frequency power/cpu_idle power/suspend_resume |
提示:可以先记录完整数据,后期在Perfetto UI中筛选查看
当需要更复杂的分析时,普通模式通过配置文件提供更强大的能力。下面是一个典型配置示例:
创建config.pbtxt文件:
text复制duration_ms: 30000
buffers: {
size_kb: 262144
fill_policy: DISCARD
}
data_sources: {
config: {
name: "linux.ftrace"
ftrace_config: {
ftrace_events: [
"sched/sched_switch",
"sched/sched_wakeup",
"irq/irq_handler_entry",
"irq/irq_handler_exit"
]
}
}
}
data_sources: {
config: {
name: "android.atrace"
atrace_categories: [
"view",
"wm",
"am",
"gfx"
]
}
}
bash复制adb push config.pbtxt /data/local/tmp/
adb shell perfetto --txt --config /data/local/tmp/config.pbtxt --out /data/misc/perfetto-traces/advanced_trace.perfetto-trace
采集完成后,需要将trace文件导出到电脑进行分析:
bash复制adb pull /data/misc/perfetto-traces/trace.perfetto-trace ~/Downloads/
使用Perfetto官方可视化工具:
分析技巧:
最近优化某电商App时,通过以下命令发现了启动瓶颈:
bash复制adb shell perfetto \
--time 15s \
--buffer 128mb \
--out /data/misc/perfetto-traces/startup.perfetto-trace \
am activity_resume wm view input sched/sched_switch binder_transaction
分析发现两个关键问题:
优化后启动时间从3.4秒降至2.1秒。这个案例说明,即使没有系统跟踪GUI,ADB+Perfetto依然能提供深度性能洞察。