第2章 Perfetto工具介绍与安装配置

Perfetto工具架构与数据流 Perfetto工具架构与数据流 应用进程 Kernel / FTrace Traced 守护进程 Trace Processor Perfetto UI SQL 查询引擎 数据流向 应用进程通过HwBinder Kernel通过FTrace 统一发送至Traced

现象识别:何时需要Perfetto分析缓存命中率

缓存命中率低会导致频繁内存访问、页面加载延迟、渲染帧率波动甚至ANR。以下现象强烈建议使用Perfetto进行诊断:

  • 应用滑动列表出现明显“白块”或图片延迟加载。
  • 系统级UI卡顿(如通知栏、最近任务)且常规log无法定位。
  • 游戏场景中帧率间歇性下降,伴随内存占用异常。
  • 同一设备上其他应用流畅,目标应用出现高频Jank。
判断规则: 如果通过 dumpsys cpuinfo 确认CPU使用率正常,但依然感觉“掉帧”,大概率是缓存命中率或I/O瓶颈。Perfetto能直接展示缓存未命中事件。

数据采集:安装与配置三种方式

Perfetto集成在Android SDK中(Android 9+),无需额外安装。以下列出三种数据采集途径及权限准备。

采集方式适用场景关键命令/操作
Android SDK自带开发阶段,简单快速在tools/perfetto/目录下直接执行./perfetto
命令行trace持续集成、自动化测试
adb shell perfetto --config /data/local/tmp/example.pbtxt --out /data/local/tmp/trace.perfetto-trace
UI界面交互式探索、临时抓取浏览器打开 ui.perfetto.dev,点击“Record new trace”
权限设置硬规则: 用户调试版本(userdebug / eng)无需额外权限;user版本需执行:
adb shell setprop persist.traced.enable 1
adb shell setprop debug.perfetto.allow_user_build 1
并重启设备。若缺少权限,抓取的trace可能为空或只有部分数据。

原因定位:理解Perfetto组件与数据流

Perfetto由以下核心模块组成,掌握其关系有助于诊断抓取失败或数据缺失问题:

  • Traced守护进程: 运行于目标设备,负责接收配置、收集trace事件。
  • Trace Session: 一次trace从开始到结束的配置、缓冲、输出过程。
  • Trace Processor: 将原始二进制trace解析为可SQL查询的关系表。
  • Perfetto UI: 提供可视化界面,支持SQL查询和火焰图。

常见故障树排查(无法抓取trace的情形):

现象可能原因定位动作
adb shell perfetto无输出traced服务未运行adb shell ps -A | grep traced
trace文件大小为0时钟源冲突或buffer不足增加配置中buffers.size_kb
UI无法打开tracetrace版本与UI不匹配升级SDK或用trace_processor本地转储

修复动作:配置要点与常见错误修正

  1. 确认SDK路径: 确保android_sdk/platform-tools/perfetto/存在,若缺失则需通过SDK Manager更新“Extras/Android Perfetto”。
  2. 配置pbtxt文件: 针对缓存命中率分析,推荐启用以下数据源:
    buffers: {
        size_kb: 16384
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "linux.ftrace"
            ftrace_config {
                ftrace_events: "mm_vmscan_lru_shrink_inactive"
                ftrace_events: "cache_reclaim"
            }
        }
    }
    data_sources: {
        config {
            name: "android.hardware.cache"
        }
    }
  3. 修复ADB权限: 若提示“permission denied”,使用adb root或切换到userdebug镜像。
  4. 验证trace输出: 抓取后立即检查文件大小:
    adb shell ls -lh /data/local/tmp/trace.perfetto-trace

复测:确认Perfetto正常工作

执行以下步骤进行完整验证:

  1. 使用预设配置抓取一次短trace:
    adb shell perfetto -c /data/local/tmp/example.pbtxt -o /data/local/tmp/test.pb -t 10s
  2. 将trace拉取到本地:
    adb pull /data/local/tmp/test.pb ./test_trace.pb
  3. 在 https://ui.perfetto.dev 上打开 test_trace.pb,确认能看到“CPU”、“Ftrace”、“Memory”等标签页。
  4. 在SQL查询框输入select count(*) from ftrace_event where name = 'cache_reclaim',若返回正数表示缓存事件已成功捕获。
复测通过标准: trace文件大小 > 100 KB,且SQL查询能检索到至少一条缓存相关事件。

预防:最佳实践与长期监控

  • 将perfetto配置(.pbtxt)纳入版本控制,统一团队抓取方式。
  • 使用perfetto --background启动长期守护trace,避免因为忘记手动抓取错过偶现问题。
  • 定期检查设备上/data/misc/perfetto-traces/目录大小,防止磁盘写满。
  • 在CI/CD管道中添加“健康检查”步骤,每夜构建后自动抓取30秒trace并检测缓存事件是否正常。
重要: 不要在生产环境user版本上长期开启全量trace,会产生额外功耗和性能开销。建议仅在调试阶段或特定设备上启用。