学习记录:Perfetto工具_1 收集 Trace

8 阅读6分钟

Perfetto 是什么?

Perfetto 是 google 从 Android10 开始引入的一个全新的平台级跟踪分析工具。它可以记录 Android 系统运行过程中的关键数据,并通过图形化的形式展示这些数据。Perfetto 不仅可用于系统级的性能分析,也是我们学习系统源码流程的好帮手。

如何抓取Trace

使用 Perfetto 一般分两步进行:

  • 收集手机运行过程中的信息,这些信息通常称之为 Trace ,收集的过程称之为抓取 Trace
  • 使用 Perfetto 打开 Trace 文件分析 Trace

使用命令行抓取trace

1.使用 perfetto 命令抓取

2perfetto_使用.png Android原生也提供了一些例子,位于external目录下:

android14\external\perfetto\test\configs\

image.png 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_tracePerfetto 团队提供的一个简化脚本,使得我们的抓取工作更加简单,国内使用需要梯子。 更多内容去看学习网址原文

使用UI工具抓取

更多内容去看学习网址原文

学习网址:

Perfetto 上手指南1 —— Trace 的抓取 | Ahao's Technical Blog

juejin.cn/post/735057…