第2章 Perfetto工具链安装与环境检查:SDK下载、adb配置、系统权限、版本兼容性检查清单

排查主线:环境未就绪 → 诊断命令收集 → 故障树定位 → 分步修复 → 复测确认 → 建立预防清单。本章所有操作均围绕“让 Perfetto 能正常抓取 Trace”这一目标展开。

2.1 现象识别:环境未就绪的典型表现

当 Perfetto 工具链缺失或配置错误时,抓取 Trace 会提前中断或输出误导信息。以下三类报错出现频率最高:

报错原文直指原因影响范围
adb: device unauthorizedadb 未授权 / 未信任主机无法连接设备
perfetto: command not foundPerfetto 二进制未安装或不在 PATH无法启动 Trace
failed to start tracing: permission deniedShell 权限不足 / 未开启开发者选项无法写入 trace 缓冲区
注意:Android 10(API 29)以下设备不支持 Perfetto 用户态抓取,必须使用系统级 tracing。版本兼容性是排查的第一步,不要跳过。

2.2 数据采集:运行诊断命令收集环境信息

使用下面三组命令快速采集设备环境状态,并将输出保存到日志文件:

# 1. 检查 adb 连接与授权状态
adb devices -l

# 2. 检查 Android 版本与 SDK 级别
adb shell getprop ro.build.version.sdk
adb shell getprop ro.build.version.release

# 3. 检查 Perfetto 可用性
adb shell perfetto --version

# 4. 检查 Shell 权限(是否 root / 是否 shell 用户)
adb shell id

将上述输出粘贴到下方检查清单中,逐项比对:

检查项期望值实际值(填写)状态
adb 设备状态device✔ / ✘
SDK 级别≥ 29✔ / ✘
Perfetto 版本≥ 15.0✔ / ✘
用户 IDuid=2000(shell) 或 root✔ / ✘

2.3 原因定位:Perfetto 环境故障树

以下故障树将“Perfetto 环境不可用”逐层拆解为四类根因。请从顶部开始,根据诊断命令的输出沿分支向下推理。

Perfetto 环境故障树 Perfetto 环境不可用 SDK 缺失/版本低 adb 连接异常 系统权限不足 版本不兼容 SDK < 29 未下载 PATH 未包含 platform-tools 未授权 unauthorized 多设备 -s 指定 无 Shell 权限 开发者 未开启 Android < 10 需系统 tracing Perfetto 版本过旧 排查规则: 先 SDK 后 adb → 先权限后版本。每层若命中,修复后立即复测,不要同时修改多个变量。 输出异常时,对照故障树颜色分支逐级下沉,直到叶子节点找到确切根因。
故障树使用技巧:从顶部红色节点开始,根据 adb devices、getprop、perfetto --version 的输出判断走哪个分支。例如输出 device unauthorized 则进入蓝色“adb 连接异常”分支,再向下到“未授权”叶子节点。

2.4 修复动作:按分支执行修复

根据故障树定位到的叶子节点,选择对应的修复方案:

叶子节点修复命令 / 步骤验证方式
SDK < 29 / 未下载从 developer.android.com/studio/releases/platform-tools 下载最新 SDK,解压后将 platform-tools 加入 PATHadb --version 显示 ≥ 33.0.0
PATH 未包含export PATH=$PATH:/path/to/platform-tools(写入 ~/.bashrc / ~/.zshrc)which adb 返回 SDK 路径
adb 未授权设备上点击“允许 USB 调试”弹窗;或执行 adb kill-server && adb start-server && adb devicesadb devices -l 状态变为 device
多设备冲突使用 adb -s <serial> shell 指定设备;或拔掉无关设备指定序列号后命令正常执行
无 Shell 权限进入“开发者选项” → “USB 调试” → “仅充电模式下允许调试”;部分设备需开启“网络 ADB”adb shell id 返回 uid=2000(shell)
开发者未开启设置 → 关于手机 → 连续点击“版本号”7 次 → 返回上一级进入“开发者选项” → 开启“USB 调试”开发者选项页面可见
Android < 10使用 adb shell perfetto --config :test --out /data/misc/perfetto/test.pb 系统级 tracing,需 root 或 eng 版本文件成功生成
Perfetto 版本过旧从 GitHub Releases 下载 perfetto 二进制:wget https://github.com/google/perfetto/releases/latest/download/perfetto -O /tmp/perfetto && adb push /tmp/perfetto /data/local/tmp/adb shell /data/local/tmp/perfetto --version ≥ 15.0
典型修复流程(SDK + adb 联调):
# Step 1: 下载并配置 SDK
unzip platform-tools-latest-linux.zip -d ~/Android/
echo 'export PATH=$PATH:~/Android/platform-tools' >> ~/.bashrc
source ~/.bashrc

# Step 2: 重启 adb 服务并授权
adb kill-server
adb start-server
adb devices          # 此时设备上应弹出授权弹窗

# Step 3: 确认环境就绪
adb shell getprop ro.build.version.sdk
adb shell perfetto --version

2.5 复测:环境就绪判定标准

执行以下完整命令链,全部通过表示环境就绪:

# 复测脚本(逐行执行,观察输出)
echo "[1] adb 连接状态"
adb devices -l | grep -E "device$" && echo "PASS" || echo "FAIL"

echo "[2] SDK 版本"
sdk=$(adb shell getprop ro.build.version.sdk)
[ "$sdk" -ge "29" ] && echo "SDK $sdk PASS" || echo "SDK $sdk FAIL (<29)"

echo "[3] Perfetto 版本"
ver=$(adb shell perfetto --version 2>/dev/null | grep -oP '\d+\.\d+')
[ -n "$ver" ] && echo "Perfetto $ver PASS" || echo "Perfetto FAIL (not found)"

echo "[4] Shell 权限"
adb shell id | grep -qE "uid=2000|uid=0" && echo "PASS" || echo "FAIL (no shell)"

输出结果应类似:

[1] adb 连接状态
PASS
[2] SDK 版本
SDK 31 PASS
[3] Perfetto 版本
Perfetto 15.2 PASS
[4] Shell 权限
PASS

任意一项 FAIL 则返回故障树对应分支重新修复。

2.6 预防:环境管理规范清单

将以下规范纳入团队 Trace 采集 SOP,避免同类问题重复发生:

类别预防措施检查频率
SDK固定使用 Android Studio 内置 SDK Manager 管理版本,保持 platform-tools 自动更新每月 / 新机器入职
adb在 ~/.android/adb_usb.ini 中预配置设备 VID,避免授权弹窗遗漏每台新设备接入时
权限将“USB 调试”和“仅充电模式下调试”写入设备配置模板,通过 adb shell settings put 批量下发每批次测试设备初始化
版本兼容在 CI 中嵌入 Perfetto 版本检测脚本,低于 15.0 时触发告警并自动推送最新二进制每次 CI 运行
避坑提醒:
  • 不要使用系统自带的旧版 adb(如 Ubuntu apt 安装的 1.0.32),必须使用 SDK platform-tools 中的最新版。
  • 设备授权弹窗容易被防误触工具拦截,建议在开发者选项中关闭“仅充电模式下允许调试”后再尝试授权。
  • 多设备场景下,务必使用 -s 参数指定序列号,否则 adb shell 会报 error: more than one device。