【安卓】ADB 使用指南
ADB 是什么
旧手机改造、应用调试、刷机,第一步都是打通电脑与手机之间的控制通道。ADB(Android Debug Bridge,安卓调试桥)是这条通道的官方实现,由谷歌提供:电脑上运行 adb 命令,连接手机内部常驻的 adbd 守护进程,执行安装应用、运行 shell 命令、传输文件、注入按键触摸、截屏录屏等系统级操作。
把手机想象成一栋大楼,普通应用是各住各屋的住户,受沙箱限制互相不能串门;ADB 则是物业的工程检修通道。手机出厂就内置了这条管线(adbd 守护进程),平时锁着,开启 USB 调试或无线调试就是把门打开。住户身份的应用拿不到物业权限,而物业通道可以进入大楼公共区域执行维护,两者的权限层级完全不同。
ADB 采用 client-server-daemon 三段式架构,理解了这个结构,后面所有命令的行为都顺理成章:
- adb 客户端:电脑终端里的 adb 命令本身,负责解析参数并向本地 server 发送请求。
- adb server:电脑上的后台进程,首次执行 adb 命令时自动启动,监听本机 TCP 5037 端口,管理所有已连接的设备并把命令路由到对应设备。
- adbd:手机端的守护进程,作为系统服务常驻运行,接收 server 转来的指令并代为执行。
server 的存在让多个客户端可以共享同一组设备:终端里敲的 adb 命令、IDE 的设备面板、自动化脚本,最终都汇到同一个 server,看到的是同一批设备。当电脑与手机通过 USB 连接时,server 与 adbd 之间走的是 adb 自家的二进制调试协议,不经过网络层。
准备工作
电脑端安装 platform-tools 工具包(内含 adb 与 fastboot,后者是刷机时用来刷写系统分区的命令行工具),从 Android 开发者网站的下载页获取即可(地址见文末参考资料),解压后无需安装:
1 | # macOS 也可以用 Homebrew 安装 |
手机端需要打开开发者选项并完成授权:
- 进入设置、关于手机,连续点击版本号 7 次,解锁开发者选项。
- 在开发者选项中打开 USB 调试。
- 用 USB 线连接电脑后,手机会弹窗列出电脑的 RSA 公钥指纹,勾选一律允许并确认。
授权的本质是公钥交换:电脑生成的密钥对公钥部分写入手机的 /data/misc/adb/adb_keys,此后该电脑连接免确认。开发者选项里的撤销 USB 调试授权可以清空这份记录,把手机交给他人前建议执行一次。
用下面的命令确认连接状态:
1 | adb devices |
显示 unauthorized 时解锁屏幕重新确认弹窗即可。偶尔遇到 adb 无响应,执行 adb kill-server 后重试,server 会重新拉起。Windows 上还有一类经典问题:部分手机助手类软件会占用 5037 端口导致 server 启动失败,关掉对应软件或改用环境变量调整端口即可。
常用命令
设备与文件
1 | adb devices # 列出已连接设备 |
安装与管理应用
1 | adb install app.apk # 安装 APK |
adb install 是给手机装应用最通用的方式,不依赖应用商店,也不受手机网络环境限制。旧手机改造中装 APK 基本都走这条命令,后面系列文章里的 Termux 就是这样装入手机的。
模拟输入与屏幕采集
1 | adb shell input keyevent KEYCODE_WAKEUP # 唤醒屏幕 |
input 系列命令把触摸、按键和文字注入系统输入管线,效果与真人操作完全一致。屏幕碎了无法触摸的旧手机可以全程靠 adb 盲打完成解锁、开启调试开关等操作,这是它在改造场景里最实用的能力之一。
系统设置与日志
1 | adb shell settings get global wifi_on # 读取系统设置项 |
settings 命令直接读写系统设置数据库,很多界面上没有开关的行为都可以在这里调整。logcat 则是排查应用崩溃、查看系统事件的第一手日志来源。
无线调试
USB 线解决第一次连接,但长期挂在角落运行的旧手机更适合无线方式。ADB 经历过两代无线方案,机制差别很大。
早期方案是 adb tcpip 5555:先用 USB 连接手机,执行 adb tcpip 5555 让 adbd 在 5555 端口开启 TCP 监听,之后用 adb connect <手机IP>:5555 无线连接。它的限制在于配置过程依赖 USB 线,且传输是明文 TCP,没有任何加密。
Android 11 起系统内置了全新的无线调试,开发者选项里打开即可,全过程不需要 USB 线:
- 配对:在手机的无线调试页面选择使用配对码配对设备,电脑执行 adb pair
:<配对端口>,输入手机显示的 6 位配对码。 - 连接:配对完成后执行 adb connect
:<连接端口>,之后就可以像 USB 连接一样使用全部命令。
机制上有三个要点:
- 安全机制:6 位配对码作为预共享密钥完成首次 TLS 握手(TLS 是传输层安全协议,为连接提供加密与身份验证),电脑公钥就此存入手机,之后的所有调试流量都走 TLS 加密通道。
- 服务发现:配对服务与连接服务通过 mDNS(组播 DNS,一种在局域网内自动发现服务地址的协议)在局域网内广播,所以连接目标有时会显示为 adb-xxxx.local 形式的域名。
- 动态端口:连接端口是随机分配的高位端口,每次关闭再打开无线调试都会变化,重新连接前需要在无线调试页面上确认当前端口。
配对关系是持久的,电脑公钥一直保存在手机里;不过连接端口随开关变化,重连时用当前端口执行 adb connect 即可。安全方面需要明确:无线调试等于把系统级通道暴露在局域网中,配对码只保护第一次配对,配对过的电脑此后可以直接连接。不可信的 WiFi 环境下不要开启无线调试,用完及时关闭。
权限层级
adbd 默认以 shell 用户身份执行命令,这个身份的权限高于普通应用、低于 root,能力边界如下:
- shell 用户可以安装卸载应用、注入输入事件、读写共享存储、读取大部分系统信息、通过 settings 调整系统行为。
- shell 用户不能修改系统分区、不能读取其他应用的私有数据、不能执行需要 root 的深度诊断。
在 userdebug 构建的系统(一种开放 root 调试能力的 Android 编译版本,通常用于自编译 ROM、模拟器和部分第三方 ROM)上,adb root 可以让 adbd 以 root 身份运行,开发者选项中的 Root debugging 开关对应这个能力;量产手机的 user 构建出于安全设计直接拒绝 adb root。root 已经是 Android 用户态的天花板,再往上是 bootloader(开机引导程序,负责在系统启动前加载内核)与内核层,属于刷机的范畴,也是这个系列后续文章的主题。
参考资料
- Android 官方 ADB 文档: https://developer.android.com/tools/adb
- SDK Platform Tools 下载页: https://developer.android.com/tools/releases/platform-tools
- ADB Wifi 架构说明(AOSP 官方): https://android.googlesource.com/platform/packages/modules/adb/+/HEAD/docs/dev/adb_wifi.md
