Perfetto 是什么?
Perfetto 是 google 从 Android10 开始引入的一个全新的平台级跟踪分析工具。它可以记录 Android 系统运行过程中的关键数据,并通过图形化的形式展示这些数据。Perfetto 不仅可用于系统级的性能分析,也是我们学习系统源码流程的好帮手。
如何抓取Trace
使用 Perfetto 一般分两步进行:
- 收集手机运行过程中的信息,这些信息通常称之为
Trace,收集的过程称之为抓取 Trace。 - 使用
Perfetto 打开 Trace 文件,分析 Trace
使用命令行抓取trace
1.使用 perfetto 命令抓取
Android原生也提供了一些例子,位于external目录下:
android14\external\perfetto\test\configs\
android_log.cfg 字段解析:
buffers {
size_kb: 32768 # 缓冲区大小:32 MB 【缓冲区0】
}
buffers {
size_kb: 32768 # 第二个缓冲区,同样32 MB 【缓冲区1】
}
data_sources {
config {
target_buffer: 1 # 使用缓冲区 1
name: "android.log" # 数据源名称:Android 日志
android_log_config {
log_ids: LID_DEFAULT # 默认日志(主要日志),采集普通应用日志(Log.d/Log.i等)
log_ids: LID_SYSTEM # 系统日志,采集系统服务/框架层日志
log_ids: LID_EVENTS # 事件日志,采集系统事件日志(如启动、配置变更)
log_ids: LID_CRASH # 崩溃日志,采集应用/系统崩溃/ANR日志
}
}
}
data_sources {
config {
name: "linux.ftrace" # 数据源标识:Linux内核ftrace跟踪
target_buffer: 0 # 使用缓冲区 0
ftrace_config {
buffer_size_kb: 4096 # ftrace专属缓冲区:4096 KB = 4 MB
drain_period_ms: 200 # 数据刷写周期:每200毫秒将缓冲区数据写入文件
# 以下是要采集的内核事件(均为进程调度相关)
ftrace_events: "print" # 内核打印信息
ftrace_events: "sched_blocked_reason" # 调度阻塞原因,进程阻塞原因(分析卡顿关键)
ftrace_events: "sched_cpu_hotplug" # CPU热插拔事件(如核心启停)
ftrace_events: "sched_process_exec" # 进程执行(exec)事件
ftrace_events: "sched_process_exit" # 进程退出事件
ftrace_events: "sched_process_fork" # 进程创建(fork)事件
ftrace_events: "sched_process_free" # 进程资源释放事件
ftrace_events: "sched_process_hang" # 进程挂起事件
ftrace_events: "sched_process_wait" # 进程等待事件
ftrace_events: "sched_switch" # 进程切换(CPU调度)事件
ftrace_events: "sched_wakeup_new" # 新进程唤醒事件
ftrace_events: "sched_wakeup" # 进程唤醒事件
ftrace_events: "sched_waking" # 进程正在唤醒事件
ftrace_events: "task_newtask" # 新任务创建事件
ftrace_events: "task_rename" # 进程/任务重命名事件
}
}
}
data_sources {
config {
name: "linux.process_stats" # 进程统计信息
target_buffer: 0 # 使用缓冲区 0
}
}
write_into_file: true # 将跟踪数据写入文件
duration_ms: 3600000 # 跟踪持续时间:1小时(3600秒)
下面的配置文件 java_hprof.cfg 专门用于采集指定 Android 应用的 Java 堆内存快照(HPROF 文件) ,核心用途是排查应用的内存问题(如内存泄漏、内存占用过高、OOM 内存溢出等)。
java_hprof.cfg
buffers {
size_kb: 100024 # 缓冲区大小:约 100 MB
fill_policy: RING_BUFFER # 填充策略:环形缓冲区(当缓冲区满时,覆盖最旧的数据)
}
data_sources {
config {
name: "android.java_hprof" # Java 堆内存分析数据源
java_hprof_config {
# 目标进程:谷歌拼音输入法的包名
process_cmdline: "com.google.android.inputmethod.latin" # 目标进程(如果需要采集其他应用,只需替换这个包名(比如微信:com.tencent.mm,设置应用:com.android.settings)
}
}
}
duration_ms: 60000 # 采集持续时长:60000毫秒 = 60秒(1分钟)
write_into_file: true # 将跟踪数据写入文件
下面的配置文件 summary.cfg 主要用于监控 CPU 调度、频率和进程状态
# This config should match the events listed in perfetto_log.proto
这份`summary.cfg`是**Perfetto(Android 官方性能分析工具)的轻量级性能汇总采集配置**,核心定位是 “快速、轻量化” 采集系统核心性能数据(而非全量日志),注释也明确要求其采集事件需匹配`perfetto_log.proto`的标准化定义,适合快速排查 CPU / 进程调度类的性能问题,而非长时间深度跟踪。
buffers {
size_kb: 100024 # 主缓冲区大小:100024 KB ≈ 97.7 MB
fill_policy: RING_BUFFER # 填充策略:环形缓冲区(当缓冲区满时,覆盖旧数据继续记录)
}
data_sources {
config {
name: "linux.ftrace" # 数据源类型:Linux内核ftrace跟踪
target_buffer: 0 # 指定使用第0个主缓冲区(唯一的主缓冲区)
ftrace_config {
buffer_size_kb: 40 # ftrace专属缓冲区仅40KB(极致轻量化)
drain_period_ms: 200 # 数据刷写周期:每200毫秒将内核数据写入主缓冲区
# 仅采集3个核心内核事件(聚焦CPU/调度)
ftrace_events: "sched_switch" # CPU进程切换事件(核心:谁占用了CPU、切换原因)
ftrace_events: "cpu_frequency" # CPU频率变化事件(如CPU升频/降频、节能/性能模式切换)
ftrace_events: "cpu_idle" # CPU空闲状态事件(CPU是否进入休眠、休眠时长)
}
}
}
**核心作用**:采集系统中所有进程的基础统计信息(如进程 PID、CPU 使用率、内存占用、进程状态(运行 / 休眠)等),与`linux.ftrace`的内核调度数据互补 —— 前者看 “内核层面 CPU 在做什么”,后者看 “具体哪个进程在占用 CPU”,形成完整的 CPU 性能分析视图。
data_sources {
config {
name: "linux.process_stats" # 数据源类型:Linux进程统计
target_buffer: 0 # 共用第0个主缓冲
}
}
**核心含义**:指定 Perfetto 的 “数据生产者组件” 为`perfetto.traced_probes`—— 这是 Android 系统中专门负责从内核读取 ftrace、进程统计等底层数据的核心组件,配置这一项能确保 Perfetto 正确连接到内核数据源,采集到所需的性能数据(新手可理解为 “指定数据采集的执行者”)。
producers {
producer_name: "perfetto.traced_probes" # 数据生产者
}
duration_ms: 10000 # 采集持续时长:10000毫秒 = 10秒
这份`summary.cfg`配置的核心信息和使用场景:
1. **核心用途**:轻量化采集 10 秒内 Linux 内核的 CPU 调度、CPU 频率 / 空闲状态,以及进程统计信息,用于快速获取系统性能汇总数据、初步定位 CPU 相关性能问题。
2. **关键特点**:只采集核心事件、缓冲区极致轻量化、采集时长短,避免数据冗余,适合快速排查问题。
3. **适用场景**:快速定位 CPU 占用高、CPU 频率异常、进程调度频繁等问题(比如测试某操作触发的 10 秒内 CPU 性能表现),是性能问题 “初步排查” 的首选配置。
2.使用 record_android_trace 命令抓取
record_android_trace 是 Perfetto 团队提供的一个简化脚本,使得我们的抓取工作更加简单,国内使用需要梯子。 更多内容去看学习网址原文
使用UI工具抓取
更多内容去看学习网址原文
学习网址: