3. 调试环境搭建与ADB基础操作
核心观点:调试SystemUI的第一步,不是学命令,是先把环境搭好、把ADB练熟。我最开始踩过不少坑,明明代码改对了,一跑就崩,结果发现是adb连不上——白白浪费半天。
3.1 你需要什么硬件和软件
先说硬件。我建议你准备一台 Pixel 设备(3/4/5/6/7系列都行),因为SystemUI的源码对Pixel适配最完整,而且解锁bootloader最方便。当然,其他支持解锁的AOSP设备也可以,但遇到奇怪问题别来找我……
软件方面,核心就是 Android SDK Platform-Tools。这里面包含adb、fastboot这些基本工具。不用装整套Android Studio,但如果你之后要改源码,Studio肯定要装。
还要装 USB 驱动(Windows上特别常见),否则设备插上电脑认不出来。我记得有一次换了台Windows笔记本,死活连不上,最后发现驱动没装——嗯,这种低级错误只犯过一次。
| 组件 | 说明 | 下载方式 |
|---|---|---|
| Pixel 设备 | 推荐 Pixel 4 及以上 | 官方商店或二手 |
| Platform-Tools | adb, fastboot 等基础工具 | Google 官方单独下载 |
| USB 驱动 | Windows 专用 | 设备制造商官网 |
| Android Studio(可选) | 用于源码导入与代码调试 | developer.android.com |
3.2 动手搭建调试环境
你以为装完adb就能用?不对,还有几个关键步骤。我按顺序列一下:
- 解锁 bootloader
进入 Developer Options,打开 OEM Unlock。然后关机,长按音量下+电源进入fastboot模式,执行fastboot flashing unlock。注意:解锁会清空设备数据,提前备份。 - 开启 USB 调试
设置 → 关于手机 → 连续点击“版本号”7次打开开发者选项 → 进入后打开“USB调试”。 - 授权计算机
连接设备后,屏幕上会弹出 RSA 指纹确认窗口,勾选“始终允许”,点击确定。如果不小心点错,可以在开发者选项里撤销授权。 - 验证连接
终端输入adb devices,出现设备序列号且状态为device才算成功。
小心! 千万不要在生产机上解锁 bootloader,我曾经有个同事在用户设备上跑 fastboot 解锁,结果…… 嗯,后来他去了别的部门。
3.3 ADB 基础命令,够用就行
我不打算把所有adb命令列一遍,那太无聊。咱们挑几个 调试SystemUI最常用 的,你先把这些练熟。
3.3.1 设备连接与基础信息
adb devices -l– 列出设备及型号adb get-state– 看看设备状态是 device 还是 recoveryadb reboot– 重启,我调试崩溃时经常要用
3.3.2 查看日志
这是重头戏。SystemUI 崩溃直接看 logcat:
adb logcat -b crash -v threadtime
adb logcat -s SystemUI:V *:S
第一个命令只看崩溃日志,第二个只显示 SystemUI 相关日志。我习惯把两者结合:
adb logcat -b crash -b main -s SystemUI:V *:S
这样既能拿到崩溃栈,又能看到 SystemUI 的正常输出。
3.3.3 文件传输与安装
adb push <local> <remote>– 把修改后的 APK 或配置文件推送到设备adb pull <remote> <local>– 把日志或dump拉回电脑adb install -r -d <apk_path>– 覆盖安装 SystemUI,记得加-r保留数据,-d允许降级
小技巧:推送 SystemUI 后需要重启 SystemUI 进程,不用重启整个手机。adb shell pkill -f com.android.systemui 就行了。
3.4 常用调试技巧
3.4.1 获取当前 SystemUI 的 dumpsys
SystemUI 崩溃前状态到底怎么样?用它看:
adb shell dumpsys activity services com.android.systemui
adb shell dumpsys window windows | grep -i systemui
第一行列出 SystemUI 里的所有服务,第二行看窗口状态。我遇到过一次崩溃是因为 SystemUI 的 Keyguard 服务卡住,dumpsys 直接暴露了问题。
3.4.2 抓取完整的 bugreport
如果你觉得手动拼凑日志太慢,直接来一发 bugreport:
adb bugreport ./bugreport.zip
这会生成一个包含 logcat、dumpsys、ANR 日志、内核日志的压缩包。我用它分析过好几次疑难崩溃。
3.4.3 过滤关键崩溃堆栈
SystemUI 崩溃后,logcat 里会打印类似这样的信息:
FATAL EXCEPTION: main
Process: com.android.systemui, PID: 12345
java.lang.NullPointerException: Attempt to invoke virtual method '...' on a null object reference
at com.android.systemui.statusbar.phone.StatusBar.onStatusBarVisibilityChanged(StatusBar.java:456)
...
看到“FATAL EXCEPTION”就对了。从堆栈第一行开始看,找到你自己的代码最后调用的地方。
3.5 避坑指南
- adb devices 显示 unauthorized – 重新插拔,或者关掉 USB 调试再打开,确认弹出授权窗口。
- adb root 无权限 – 大多数 OTA 固件不允许 adb root。可以试试
adb shell su,如果设备有 root 权限,就用 su 切换。 - 设备连接断断续续 – 换根数据线。我遇到过一根充电线只能充电不能传数据…… 太坑了。
- logcat 日志太长看不到 – 使用
adb logcat -v threadtime -d > crash.log保存到文件,再到编辑器里搜索关键词。
我曾经因为没关某个测试app的日志过滤,导致SystemUI的崩溃信息被淹没,花了三小时才发现。所以建议你:先清空缓冲区 adb logcat -c,然后立即复现崩溃,这样拿到的是新鲜的。
3.6 本章知识结构
下面这张SVG图把整个调试环境的搭建流程和ADB工具体系串了起来,你可以照着走一遍。