23、Fastboot与ADB联合使用:同时使用ADB和Fastboot进行调试、无线ADB与Fastboot

说实话,做了这么多年底层开发,我见过太多工程师把ADB和Fastboot当成两个完全独立的工具来用。其实它们是一对黄金搭档。一个管系统里的调试,一个管系统外的刷写。你想想看,如果能把它们结合起来,很多棘手的问题就能迎刃而解。

今天我们就聊聊怎么把这两个工具玩出花来。我会结合我自己的踩坑经历,给你讲讲联合调试的技巧,还有无线ADB和Fastboot的那些事儿。

ADB与Fastboot的协作模式

先理清一个概念。ADB和Fastboot不是互斥的,它们在不同阶段发挥作用。我习惯把设备的状态分成三种:

  • 正常开机状态:ADB可用,Fastboot不可用
  • Bootloader模式:Fastboot可用,ADB不可用
  • Recovery模式:两者都可能可用,取决于ROM实现

那怎么联合使用呢?最常见的场景是这样的:

  1. 先用ADB把设备重启到Bootloader模式
  2. 在Bootloader模式下用Fastboot刷写分区
  3. 刷完后用Fastboot重启,再切回ADB做验证

这个流程看起来简单,但实际项目中坑不少。我曾经遇到一个情况:刷完boot分区后设备死活起不来,用ADB连不上,用Fastboot又能识别。后来发现是刷写后没有清除用户数据,导致旧数据和新内核不兼容。嗯,从那以后我每次刷完都会加一句 fastboot -w

核心思路:ADB负责"软"操作(日志、文件传输、命令执行),Fastboot负责"硬"操作(分区刷写、锁状态管理)。两者配合,才能覆盖完整的调试链路。

实战:从ADB切换到Fastboot再切回来

我直接给你一个完整的调试脚本。这个脚本我在项目里用了好几年,基本没出过问题。

#!/bin/bash
# 联合调试示例脚本

# 1. 先用ADB确认设备在线
adb devices
if [ $? -ne 0 ]; then
    echo "ADB设备未找到,请检查连接"
    exit 1
fi

# 2. 用ADB重启到Bootloader
adb reboot bootloader
sleep 5

# 3. 确认Fastboot设备
fastboot devices

# 4. 刷写boot分区
fastboot flash boot new_boot.img

# 5. 刷写vendor分区
fastboot flash vendor new_vendor.img

# 6. 清除用户数据(可选)
fastboot -w

# 7. 重启到系统
fastboot reboot

# 8. 等待设备重新连接
sleep 10

# 9. 用ADB验证刷写结果
adb wait-for-device
adb shell "getprop ro.build.version.incremental"
adb logcat -d | grep "Boot completed"

你看,这个脚本里ADB和Fastboot交替出现。每个步骤之间加了适当的等待时间,这是很多人容易忽略的。我刚开始写脚本时没加sleep,结果Fastboot还没准备好,adb reboot bootloader就执行完了,导致后续命令全部失败。

小技巧:在脚本里可以用 fastboot getvar 来确认设备是否真的进入了Fastboot模式。比如 fastboot getvar product 会返回设备型号,如果返回空,说明设备还没准备好。

无线ADB:摆脱线缆束缚

说实话,有线调试虽然稳定,但有时候真的很烦。尤其是你在调试车载设备或者智能音箱时,线缆长度不够,或者接口位置刁钻,那叫一个难受。

Android从11开始原生支持无线ADB调试。配置方法很简单:

  1. 确保手机和电脑在同一个Wi-Fi网络下
  2. 用USB连接一次,执行 adb tcpip 5555
  3. 拔掉USB线,执行 adb connect 设备IP:5555

举个例子:

# 第一步:USB连接后开启无线模式
adb tcpip 5555

# 第二步:查看设备IP(在设备上打开设置-关于手机-状态信息)
# 假设IP是 192.168.1.100
adb connect 192.168.1.100:5555

# 第三步:验证连接
adb devices
# 应该看到类似输出:
# List of devices attached
# 192.168.1.100:5555    device

无线ADB有个坑,我必须要提醒你。设备休眠后Wi-Fi可能会断开,导致ADB连接丢失。我遇到过好几次,调试到一半设备黑屏了,然后adb devices就变成空的了。解决办法有两个:

  • 在开发者选项里开启"不锁定屏幕"
  • 或者用 adb shell svc wifi enable 保持Wi-Fi常开

注意:无线ADB不适合刷写操作。因为刷写过程中如果网络断开,设备可能变砖。我一般只用无线ADB做日志查看和简单的命令执行。真要刷分区,还是老老实实插线。

无线Fastboot:真的可行吗?

这个问题我经常被问到。答案是:部分可行,但限制很多。

Android原生并不支持无线Fastboot。Fastboot协议本身是建立在USB上的。但是,有些厂商(比如Google的Pixel系列)在Bootloader里实现了网络功能,可以通过以太网或Wi-Fi进行Fastboot操作。

具体做法是这样的:

# 1. 重启到Bootloader
adb reboot bootloader

# 2. 在Bootloader界面选择"Network Fastboot"(如果有这个选项)
# 或者通过fastboot命令开启
fastboot oem enable-network-fastboot

# 3. 在电脑上连接
fastboot tcp 192.168.1.100:5554

说实话,这个功能我用得不多。原因很简单:不稳定。无线刷写一旦中断,设备就真的变砖了,连救回来的机会都没有。我建议你只在以下场景使用无线Fastboot:

  • 刷写非关键分区(比如userdata)
  • 设备物理上无法连接USB(比如某些嵌入式设备)
  • 只是查看Bootloader信息,不执行写操作

我的建议:无线ADB可以大胆用,无线Fastboot慎用。如果非要无线刷写,请确保网络稳定,并且手边有USB线作为备用方案。

联合调试的典型场景

我整理了几个实际项目中经常用到的联合调试场景,你可以直接拿来用。

场景 ADB操作 Fastboot操作 注意事项
刷写新内核 adb reboot bootloader fastboot flash boot boot.img 刷完后用adb验证内核版本
恢复变砖设备 无法使用 fastboot flash all 需要完整刷机包
抓取启动日志 adb logcat -b all fastboot getvar all 先抓Fastboot信息,再抓系统日志
OTA升级调试 adb sideload ota.zip fastboot update ota.zip 两种方式选一种即可
解锁/上锁 adb reboot bootloader fastboot flashing unlock 解锁会清除所有数据

这个表格是我多年经验的浓缩。你看第三行,抓取启动日志时,很多人只记得用logcat,却忘了Fastboot也能提供一些底层信息。比如 fastboot getvar all 可以拿到分区表、硬件版本、串号等,这些信息在分析启动失败时非常有用。

知识体系总览

下面这张图把本章的核心逻辑梳理了一下。你可以看到ADB和Fastboot在不同阶段的分工,以及无线模式的位置。

ADB与Fastboot联合调试知识体系 正常系统 ADB可用 Bootloader模式 Fastboot可用 Recovery模式 两者皆可用 adb reboot bootloader fastboot reboot recovery ADB 操作 • adb logcat - 抓取日志 • adb shell - 执行命令 • adb push/pull - 文件传输 • adb tcpip - 开启无线模式 Fastboot 操作 • fastboot flash - 刷写分区 • fastboot boot - 临时启动 • fastboot getvar - 获取信息 • fastboot oem - 厂商命令 无线调试模式 无线ADB:adb connect IP:5555(推荐日常调试使用) 无线Fastboot:fastboot tcp IP:5554(仅部分设备支持,慎用)

这张图把整个调试链路串起来了。你看,正常系统、Bootloader、Recovery三个状态之间可以互相切换,每个状态下都有对应的操作。无线模式是锦上添花,但不是主力。

最后说一句:工具是死的,人是活的。ADB和Fastboot联合使用的精髓不在于记住多少命令,而在于理解设备在不同阶段的能力边界。你只要搞清楚"什么时候该用哪个工具",大部分问题都能自己解决。


公众号:蓝海资料掘金营,微信deep3321