第2章 Perfetto工具链安装与环境检查:SDK下载、adb配置、系统权限、版本兼容性检查清单
排查主线:环境未就绪 → 诊断命令收集 → 故障树定位 → 分步修复 → 复测确认 → 建立预防清单。本章所有操作均围绕“让 Perfetto 能正常抓取 Trace”这一目标展开。
2.1 现象识别:环境未就绪的典型表现
当 Perfetto 工具链缺失或配置错误时,抓取 Trace 会提前中断或输出误导信息。以下三类报错出现频率最高:
| 报错原文 | 直指原因 | 影响范围 |
|---|---|---|
adb: device unauthorized | adb 未授权 / 未信任主机 | 无法连接设备 |
perfetto: command not found | Perfetto 二进制未安装或不在 PATH | 无法启动 Trace |
failed to start tracing: permission denied | Shell 权限不足 / 未开启开发者选项 | 无法写入 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 | ✔ / ✘ | |
| 用户 ID | uid=2000(shell) 或 root | ✔ / ✘ |
2.3 原因定位:Perfetto 环境故障树
以下故障树将“Perfetto 环境不可用”逐层拆解为四类根因。请从顶部开始,根据诊断命令的输出沿分支向下推理。
故障树使用技巧:从顶部红色节点开始,根据
adb devices、getprop、perfetto --version 的输出判断走哪个分支。例如输出 device unauthorized 则进入蓝色“adb 连接异常”分支,再向下到“未授权”叶子节点。
2.4 修复动作:按分支执行修复
根据故障树定位到的叶子节点,选择对应的修复方案:
| 叶子节点 | 修复命令 / 步骤 | 验证方式 |
|---|---|---|
| SDK < 29 / 未下载 | 从 developer.android.com/studio/releases/platform-tools 下载最新 SDK,解压后将 platform-tools 加入 PATH | adb --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 devices | adb 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。