使用浏览器打开 ui.perfetto.dev/ 界面如下:
Buffers and duration
Recording mode(录制模式)
这里提供了两种模式:
- Stop when full(缓冲区满即停止)
当分配的缓冲区写满时,自动停止录制。适合短时间、精确的事件捕捉。 - Ring buffer(环形缓冲区)
缓冲区写满后,新数据会覆盖最旧的数据,持续录制直到手动停止。适合长时间监控,但可能丢失早期数据。 - Long trace(长时跟踪)
一种结合了文件流出的模式,可以将数据实时写入磁盘,支持非常长时间的录制(需设备支持)。
Recording settings(录制设置)
In-memory buffer size(内存缓冲区大小)
- 含义:分配给跟踪数据的内存缓冲区总大小。截图显示为 64 MB。
- 作用:缓冲区越大,能存储的跟踪数据越多,尤其在短时间内采集大量事件(如 CPU 调度、GPU 活动)时很有用。但过大会占用系统内存。
Max duration(最大持续时间)
- 含义:录制的最长时间,到达设定时间后自动停止。截图显示为 00:01:00(1 分钟)。
- 作用:限制录制时长,避免生成过大的文件或无限录制。
Deflate (gzip) compression(gzip 压缩)
- 含义:录制结束后对跟踪文件进行压缩,减小文件体积。
使用命令查看你的设备,支持哪些数据源
adb shell perfetto --query
| 数据源名称 | 说明 |
|---|---|
android.heapprofd | 用于分析 Native 内存分配,可追踪 C/C++ 堆内存的申请和释放,帮助定位内存泄漏和堆使用情况。 |
android.java_hprof | 用于生成 Java 堆转储文件(HPROF),分析 Java 对象的内存占用和引用关系。 |
android.log | 采集 logcat 日志,可将指定的日志级别和标签输出到跟踪文件中,便于关联系统事件。 |
android.packages_list | 记录系统中安装的包信息,包括包名、UID、版本等,常用于关联进程与应用程序。 |
android.polled_state | 轮询式采集系统状态信息,如电池、充电状态、电量等。 |
android.power | 跟踪电源管理相关事件,包括电源 rails 的电流/电压、充电状态、电量变化等,用于功耗分析。 |
android.surfaceflinger.frame | 采集 SurfaceFlinger 的帧信息,包括帧开始/结束、合成耗时、VSYNC 时间戳(含 vsync-app)等,是分析显示流畅度的关键数据源。 |
android.surfaceflinger.frametimeline | 提供更精细的帧时间线数据,追踪从应用绘制到屏幕显示的全链路延迟,通常与 android.surfaceflinger.frame 配合使用。 |
linux.ftrace | 基于内核 ftrace 的事件采集,可捕获调度、CPU 频率、中断、系统调用等底层事件,是最常用的数据源之一。 |
linux.inode_file_map | 记录文件 inode 到文件路径的映射,用于将文件操作(如 I/O)与具体文件关联。 |
linux.perf | 基于 perf_event_open 的性能计数器采样,用于 CPU 性能分析(如采样调用栈、统计 CPU 周期等)。 |
linux.process_stats | 轮询式采集进程/线程的统计信息,包括 CPU 时间、内存占用(PSS/RSS)、线程数等,用于监控资源变化。 |
linux.sys_stats | 采集系统级统计信息,如 CPU 使用率、内存使用、磁盘 I/O、网络流量等(来自 /proc/stat、/proc/meminfo 等)。 |
linux.system_info | 记录系统基本信息,如内核版本、CPU 型号、硬件配置等,用于辅助分析。 |
perfetto.metatrace | 用于调试 Perfetto 自身性能的内部跟踪,记录 Perfetto 服务的元事件,通常开发者使用。 |
这些数据源可以组合使用,根据分析目标选择合适的配置。例如,要分析 UI 渲染性能,可以启用 android.surfaceflinger.frame 和 linux.ftrace(配合 gfx、view 等 ATrace 类别);要排查内存问题,可选用 android.heapprofd 和 android.java_hprof。
CPU
CPU给出了四类收集方式:
Coarse CPU usage counter(粗略 CPU 使用计数器)
Scheduling details(调度细节)
CPU frequency and idle states(CPU 频率与空闲状态)
Syscalls(系统调用)
| 探针 | 数据量 | 开销 | 精度 | 主要用途 |
|---|---|---|---|---|
| Coarse CPU usage | 小 | 极低 | 秒级 | 整体负载趋势 |
| Scheduling details | 大 | 中 | 微秒级 | 线程调度分析 |
| CPU freq & idle | 中 | 低 | 事件级 | 功耗/性能分析 |
| Syscalls | 极大 | 高 | 微秒级 | 系统调用追踪 |
GPU
| 探针 | 适用 GPU | 数据量 | 主要用途 | 你的设备 |
|---|---|---|---|---|
| GPU frequency | 通用 | 小 | 频率/功耗分析 | ✅ 可用 |
| GPU memory | Android 12+ | 中 | 显存占用 | ✅ 可用 |
| GPU work period | Android 14+ | 中 | 应用级 GPU 统计 | ⚠️ 需 Android 14+ |
| GPU Render Stages | 需支持 | 大 | 渲染管线分析 | ⚠️ 需检查支持性 |
| Mali GPU Counters | Mali only | 大 | 硬件计数器 | ❌ 不可用 |
| Mali Fence Events | Mali only | 中 | 同步分析 | ❌ 不可用 |
Power(电源)
| 探针 | 监控对象 | 数据粒度 | 主要用途 |
|---|---|---|---|
| Battery drain & power rails | 电池 + 各子系统功耗 | 250ms 轮询 | 耗电分析、续航优化 |
| Board voltages & frequencies | 主板电压/频率传感器 | 事件驱动 | 电源管理策略、硬件调试 |
Android apps & svcs
ATrace 类别详解
| 类别 | 英文全称 | 说明 |
|---|---|---|
adb | ADB | ADB 调试相关事件(连接、命令执行) |
aidl | AIDL calls | Android 接口定义语言跨进程调用 |
am | Activity Manager | Activity 生命周期管理(启动、暂停、恢复) |
audio | Audio | 音频播放、录制、路由 |
binder_driver | Binder Kernel driver | Binder 内核驱动事件(IPC 通信底层) |
binder_lock | Binder global lock trace | Binder 全局锁竞争追踪 |
bionic | Bionic C Library | Bionic C 库(malloc、free、pthread、文件操作) |
camera | Camera | 相机操作(打开、预览、拍照、录像) |
dalvik | Dalvik VM | Dalvik/ART 虚拟机(GC、JIT、类加载) |
database | Database | 数据库操作(SQLite 查询、事务) |
disk | Disk I/O | 磁盘读写操作 |
freq | CPU Frequency | CPU 频率变化(DVFS) |
gfx | Graphics | 图形渲染(关键!Skia、OpenGL、Vulkan、RenderThread) |
hal | Hardware Modules | 硬件抽象层模块 |
idle | CPU Idle | CPU 空闲状态进入/退出 |
input | Input | 输入事件(触摸、按键、传感器) |
memory | Memory | 内存分配/回收 |
memreclaim | Kernel Memory Reclaim | 内核内存回收(kswapd、LMK) |
network | Network | 网络操作(WiFi、移动数据、Socket) |
nnapi | NNAPI | 神经网络 API(AI 推理加速) |
pm | Package Manager | 包管理器(安装、卸载、查询应用) |
power | Power Management | 电源管理(休眠、唤醒、省电模式) |
res | Resource Loading | 资源加载(XML、图片、字符串) |
rro | Runtime Resource Overlay | 运行时资源覆盖(主题、定制) |
rs | RenderScript | RenderScript 计算框架 |
sched | CPU Scheduling | CPU 调度(上下文切换、线程迁移) |
sm | Sync Manager | 同步管理器(账户同步) |
ss | System Server | 系统服务(SystemServer 进程事件) |
sync | Synchronization | 同步机制(锁、屏障) |
thermal | Thermal event | 热管理事件(温控、降频) |
vibrator | Vibrator | 震动器控制 |
video | Video | 视频编解码、播放 |
view | View System | 视图系统(关键!测量、布局、绘制) |
webview | WebView | WebView 加载、渲染、JS 执行 |
wm | Window Manager | 窗口管理(关键!Surface 创建、窗口动画) |
workq | Kernel Workqueues | 内核工作队列 |
Event log(logcat)类别详解
| 类别 | 说明 |
|---|---|
Crash | 崩溃日志(Java/Native 崩溃) |
Main | 主日志缓冲区(应用日志) |
Binary events | 二进制事件日志 |
Kernel | 内核日志(printk) |
Radio | 射频/基带日志 |
Security | 安全相关日志 |
Stats | 统计日志 |
System | 系统日志(framework) |
| 探针 | 数据类型 | 主要用途 | 版本要求 |
|---|---|---|---|
| Frame timeline | 帧时间戳 | UI 卡顿/掉帧分析 | Android 12+ |
| Game intervention list | 游戏模式状态 | 游戏性能限制排查 | Android 13+ |
| Network Tracing | 网络数据包 | 网络性能分析 | Android 14+ |
| Statsd atoms | 系统统计指标 | 系统级趋势分析 | 通用 |
Network(网络)
| 选项 | 数据量 | 详细程度 | 主要用途 |
|---|---|---|---|
| 802.11 layer events | 中 | 协议层(连接/扫描/认证) | Wi-Fi 连接问题 |
| Packets TX/RX | 极大 | 包级(每个数据包) | 吞吐量/延迟分析 |
| Additional ftrace events | 依配置 | 驱动特定 | 厂商驱动调试 |
Stack sampling(栈采样)
buffers {
size_kb: 65536 // 缓冲区大小:64MB(65536 KB)
fill_policy: RING_BUFFER 环形缓冲区(满了覆盖旧数据,适合长时间采集)
}
data_sources {
config {
name: "linux.perf" // 数据源名称:Linux perf 事件(用于 CPU 性能计数和堆栈采样)
// perf 事件详细配置
perf_event_config {
timebase { // 时间基准配置
frequency: 100 // 采样频率:100 Hz(每秒采样 100 次,每 10ms 一次)
timestamp_clock: PERF_CLOCK_MONOTONIC // 时间戳时钟类型:单调时钟(MONOTONIC,不受系统时间调整影响)
}
callstack_sampling { // 调用栈采样配置(生成火焰图)
scope { // 采样范围配置
target_cmdline: "com.android.phone" // 目标进程:只采样 com.android.phone 进程,可添加多行 target_cmdline 指定多个进程
}
}
}
}
}
duration_ms: 60000 // 追踪持续时间:60 秒(60000 毫秒)
compression_type: COMPRESSION_TYPE_DEFLATE // 压缩类型:DEFLATE(zlib 压缩,减小文件大小)
Perfetto SDK
代码示例对比
| API 类型 | 代码示例 |
|---|---|
| 旧 ATrace | ATRACE_BEGIN("draw"); / Trace.beginSection("draw") |
| 新 Perfetto SDK | PERFETTO_TE_SLICE_BEGIN("draw"); / os.PerfettoTrace.begin("draw") |
Options(预定义类别)
| 类别 | 英文 | 说明 |
|---|---|---|
mq | Message Queue | 消息队列事件(线程间通信) |
gfx | Graphics | 图形渲染事件(关键!) |
servicemanager | Service Manager | 服务管理器(Binder 服务注册/查找) |
对比总结:Perfetto SDK vs ATrace
| 特性 | ATrace | Perfetto SDK |
|---|---|---|
| API 年代 | 旧(Android 4.3+) | 新(Android 10+) |
| 性能开销 | 中等 | 更低 |
| 功能丰富度 | 基础 | 更丰富(支持异步事件、计数器、元数据) |
| 数据类型 | 仅时间区间 | 时间区间 + 计数器 + 瞬时事件 |
| 平台支持 | Android | Android + Linux + Chrome |
| 推荐度 | 兼容旧代码 | 新项目推荐 |
应用代码中使用 Perfetto SDK
C++ 代码
#include "perfetto/tracing.h"
void MyRenderer::Draw() {
// 开始追踪区间
TRACE_EVENT_BEGIN("gfx", "DrawFrame");
// ... 渲染代码 ...
// 结束追踪区间
TRACE_EVENT_END("gfx");
}
Java/Kotlin 代码
import android.os.PerfettoTrace
fun drawFrame() {
// 开始追踪区间
PerfettoTrace.beginSection("gfx", "DrawFrame")
// ... 渲染代码 ...
// 结束追踪区间
PerfettoTrace.endSection()
}
Advanced settings(高级设置)
buffers {
size_kb: 65536 缓冲区大小:64MB(65536 KB)
fill_policy: RING_BUFFER 环形缓冲区(满了覆盖旧数据,适合长时间采集)
}
data_sources {
config {
name: "linux.ftrace" // 数据源名称:Linux Ftrace(内核追踪)
ftrace_config { // Ftrace 详细配置
// ========== Event groups(事件组)==========
ftrace_events: "binder/*" // Binder IPC 驱动事件(跨进程通信)
ftrace_events: "block/*" // 块设备 I/O 事件(磁盘/存储读写)
ftrace_events: "clk/*" // 时钟子系统事件(CPU/GPU/总线时钟)
ftrace_events: "devfreq/*" // 设备频率调节事件(GPU、DDR 等 DVFS)
ftrace_events: "ext4/*" // Ext4 文件系统事件
ftrace_events: "f2fs/*" // F2FS 文件系统事件
ftrace_events: "i2c/*" // I2C 总线通信事件
ftrace_events: "irq/*" // 中断处理事件
ftrace_events: "kmem/*" // 内核内存分配事件(kmalloc、slab)
ftrace_events: "memory_bus/*" // 内存总线事件
ftrace_events: "mmc/*" // MMC/SD 卡控制器事件
ftrace_events: "oom/*" // 内存不足(OOM)事件
ftrace_events: "power/*" // 电源管理事件(CPU 频率、空闲状态)
ftrace_events: "regulator/*" // 电源调节器事件(电压调节)
ftrace_events: "sched/*" // CPU 调度事件(线程切换、唤醒、阻塞)
ftrace_events: "sync/*" // 同步机制事件(fence、barrier)
ftrace_events: "task/*" // 任务管理事件(fork、exec、exit)
ftrace_events: "vmscan/*" // 内存回收事件(kswapd、page reclaim)
ftrace_events: "fastrpc/*" // 高通 FastRPC 远程调用事件
buffer_size_kb: 2048 // Ftrace 环形缓冲区大小:2MB(2048 KB)
drain_period_ms: 500 // 数据读取间隔:500 毫秒(从内核读取到 Perfetto)
symbolize_ksyms: true // 启用内核符号解析(将地址转换为函数名),需要 userdebug/eng 版本,user 版本无效
disable_generic_events: true // 禁用通用事件捕获(只采集上面明确指定的事件) 减少开销,避免未知事件淹没缓冲区
}
}
}
duration_ms: 60000 // 追踪持续时间:60 秒(60000 毫秒)
compression_type: COMPRESSION_TYPE_DEFLATE // 压缩类型:DEFLATE(zlib 压缩,减小文件大小)
# ===================== 缓冲区配置 =====================
# 主缓冲区:大小64MB(65536 KB),采用环形缓冲区(数据满了覆盖旧数据)
buffers {
size_kb: 65536 # 缓冲区大小,单位KB(65536 KB = 64 MB),用于存储主要追踪数据
fill_policy: RING_BUFFER
}
buffers {
size_kb: 4096 # 次要缓冲区大小,单位KB(4096 KB = 4 MB),专门给进程统计数据使用
fill_policy: RING_BUFFER
}
# ===================== 数据源1:Linux Ftrace(核心系统事件) =====================
data_sources {
config {
name: "linux.ftrace" # 数据源名称:Linux Ftrace(Linux内核底层追踪机制),用于抓取内核级事件
ftrace_config { # Ftrace专属配置块
ftrace_events: "sched/sched_process_exit" # 抓取进程退出事件(记录进程结束的时间、PID等)
ftrace_events: "sched/sched_process_free" # 抓取进程资源释放事件(记录进程完全销毁、资源回收的事件)
ftrace_events: "task/task_newtask" # 抓取新进程创建事件(记录新进程/线程创建的时间、父进程PID等)
ftrace_events: "task/task_rename" # 抓取进程重命名事件(记录进程名称修改的事件,比如线程改名)
}
}
}
# ===================== 数据源2:Linux进程统计 =====================
data_sources {
config {
name: "linux.process_stats" # 数据源名称:Linux进程统计,用于抓取进程/线程的基本信息
target_buffer: 1 # 指定该数据源的数据写入到第2个缓冲区(上面定义的4MB缓冲区),隔离进程统计数据
process_stats_config { # 进程统计专属配置块
# 启动追踪时,立即扫描系统中所有正在运行的进程,确保初始进程列表完整
scan_all_processes_on_start: true
}
}
}
# ===================== 全局配置 =====================
duration_ms: 60000 # 追踪时长:60000毫秒 = 60秒,达到时长后自动停止追踪
compression_type: COMPRESSION_TYPE_DEFLATE # 压缩类型:使用DEFLATE算法(类似ZIP)压缩trace文件,减小文件体积