文章目录
- 一、Perfetto介绍
- 二、抓取方法
- 2.1 手机端直接抓取
- 2.1.1 打开系统跟踪
- 2.1.2 开始录制
- 2.2 使用 adb 抓取
- 2.3 通过 Perfetto 网页自定义抓取
- 三、trace分析方法
- 3.1 打开trace文件
- 3.2 查看方法
一、Perfetto介绍
Perfetto 是一个用于性能检测和跟踪分析的生产级开源堆栈。它提供用于记录系统级和应用级跟踪的服务和库、本机 + Java 堆分析、使用 SQL 分析跟踪的库以及用于可视化和探索多 GB 跟踪的基于 Web 的 UI。
主要特点:
-
可以在线抓取长时间的trace:可以长达一个小时,另外抓取的文件size也可以达到GB级别,这样就可以在后台开启,让它一直抓取trace了,特别适用于那种复现概率很低,又比较严重的性能问题。
-
Perfetto具有很好的可扩展性:它除了提供标准的tracepoints之外,例如CPU调度信息,内存信息等,还可以通过atrace HAL层扩展,在Android P当中,Google新增加了一个atrace HAL层,atrace进程可以调用这个HAL的接口来获取当前的扩展信息,相关代码可见Google 提交,这样如果需要扩展tracepoints的话,就可以按照graphic的示例添加即可。
-
提供全新的Perfetto UI网站:可以在上面通过选取开关的方式,自动生成抓取trace的命令,同时可以打开trace文件,自动把protobuf或者json转变成UI,另外还集成了几种预定义的trace分析统计工具,详情可见它的 Metrics and auditors 选项。
Perfetto本身是一个框架,关于它的架构和模块的详细介绍,有兴趣的可以参考它的doc网站,它的源码可以参考Android Source Tree的 /external/perfetto 目录,里面有很多的tools和脚本,可以拿来直接使用,本文只对这个工具做简单的使用介绍。
doc网站地址:https://perfetto.dev/docs/
二、抓取方法
2.1 手机端直接抓取
2.1.1 打开系统跟踪
方法1:在开发者选项中打开
- 打开开发者选项
- 进入开发者选项,选择
系统跟踪(System tracing)
,开启显示“快捷设置”图块(Show Quick Setting tile)
- 打开顶部下滑菜单快捷设置面板的快捷图标,或者打开开发者选项
系统跟踪(System tracing)
的录制跟踪记录(Record trace)
- 通知面板会出现一个系统跟踪通知,点击可以开始和停止录制
方法2:通过adb命令打开
adb shell am start com.android.traceur/com.android.traceur.Main Activity
对应的界面如下:
选中显示“快捷设置”图块,会在控制中心显示快速抓取trace图块:
2.1.2 开始录制
数据保存位置/data/local/traces
到处trace文件:adb pull /data/local/traces .
2.2 使用 adb 抓取
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 60s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
-o /data/misc/perfetto-traces/trace_file.perfetto-trace
:输出trace的路径
-t 60s
:最多抓取时长,可以Ctrl+C停止
sched ... memory
:要抓取相关模块
更多配置说明,参见文档:https://perfetto.dev/docs/concepts/config
2.3 通过 Perfetto 网页自定义抓取
通过Perfetto UI网站可以帮助生成配置文件,点击 Record new trace会看到很多配置界面
方法1:自动生成命令,然后终端执行
选择想要的tracepoints之后,点击Recording command
,将命令拷贝出来直接在终端就可以执行,完成之后分析/data/misc/perfetto-traces/trace
文件
adb shell perfetto \-c - --txt \-o /data/misc/perfetto-traces/trace \
<<EOFbuffers: {size_kb: 63488fill_policy: DISCARD
}
buffers: {size_kb: 2048fill_policy: DISCARD
}
data_sources: {config {name: "android.packages_list"target_buffer: 1}
}
data_sources: {config {name: "android.power"android_power_config {battery_poll_ms: 1000battery_counters: BATTERY_COUNTER_CAPACITY_PERCENTbattery_counters: BATTERY_COUNTER_CHARGEbattery_counters: BATTERY_COUNTER_CURRENTcollect_power_rails: true}}
}
data_sources: {config {name: "linux.process_stats"target_buffer: 1process_stats_config {scan_all_processes_on_start: true}}
}
data_sources: {config {name: "linux.sys_stats"sys_stats_config {stat_period_ms: 1000stat_counters: STAT_CPU_TIMESstat_counters: STAT_FORK_COUNTcpufreq_period_ms: 1000}}
}
data_sources: {config {name: "linux.ftrace"ftrace_config {ftrace_events: "sched/sched_switch"ftrace_events: "power/suspend_resume"ftrace_events: "sched/sched_wakeup"ftrace_events: "sched/sched_wakeup_new"ftrace_events: "sched/sched_waking"ftrace_events: "power/cpu_frequency"ftrace_events: "power/cpu_idle"ftrace_events: "power/gpu_frequency"ftrace_events: "raw_syscalls/sys_enter"ftrace_events: "raw_syscalls/sys_exit"ftrace_events: "sched/sched_process_exit"ftrace_events: "sched/sched_process_free"ftrace_events: "task/task_newtask"ftrace_events: "task/task_rename"buffer_size_kb: 2048drain_period_ms: 250}}
}
duration_ms: 10000EOF
方法2:网页连接设备直接抓取
“Add ADB Device” 选择手机设备,如下图,其中有一些参数配置,根据自己的需要添加修改
最后点击右上角 “Start Recording”
三、trace分析方法
3.1 打开trace文件
在Open trace file中打开pull出来的trace
打开以后,就可以分析其中的数据:
3.2 查看方法
基本操作通过“W”、“S”、“A”、“D”实现,英文键盘下,w可以实现对trace范围的放大,s可以缩小范围,a整体左移,d整体右移。
基本操作还有疑问,可以在页面中shift+/ ,也就是“?”,通过官方提供的操作指南可以学习基本操作。
左键单击某个线程,既可看到详细信息,例如耗时等。再shift+M,可以精准标注该线程,使用鼠标左键长按整个区间,选择在需要分析的部分长按,既可获取在此期间的各个进程的操作,如图所示就是在still capture期间内CPU负载的具体情况,如果想看此时CPU 频率,左键长按在CPU Frequency上既可查看期间内频率的变化。