概念
-
ADB 是 Android 平台的 调试桥接协议,允许主机(PC)与 Android 设备通信。
-
通过 ADB,开发者可以执行命令、调试应用、传输文件、访问 shell、调试 logcat 等。
-
ADB 运行在 USB 或 TCP/IP 上,但最常用的是 USB 连接。
USB 层实现
-
USB 模式:ADB 依赖 USB CDC 或自定义 USB Interface(Android Device Class)实现。
-
端点类型:通常使用 Bulk IN / Bulk OUT 端点传输数据。
-
Bulk OUT:主机发送数据到设备
-
Bulk IN:设备发送数据到主机
-
-
USB 描述符:ADB 设备在 USB 枚举阶段提供自定义接口描述符,标识它支持 ADB 服务。
ADB 协议层
ADB 协议主要由 四种消息类型组成,每条消息长度固定(24 字节 header + 可选 payload):
-
CNXN(Connect)
-
建立 ADB 连接,初始化主机和设备之间的会话。
-
-
AUTH(Authentication)
-
认证主机和设备,确保安全通信。
-
使用 RSA 公钥进行签名验证。
-
-
OPEN / OKAY / CLSE(Channel Management)
-
管理逻辑通道,每个应用或服务可使用不同 channel ID。
-
OPEN:打开新 channel
-
OKAY:确认 channel 已打开或接收数据
-
CLSE:关闭 channel
-
-
WRTE(Write Data)
-
用于在 channel 上传输实际数据。
-
设备或主机将数据写入 channel 对应缓冲区,并等待 OKAY 确认。
-
数据传输流程
-
USB 枚举:设备连接 PC,枚举 USB 设备,识别 ADB 接口。
-
连接建立:主机发送 CNXN 消息,设备响应 CNXN。
-
认证:如果需要,设备发送 AUTH 消息进行公钥认证。
-
通道管理:主机请求打开 channel(OPEN),设备返回 OKAY。
-
数据传输:主机或设备通过 WRTE 发送数据,接收方返回 OKAY 确认。
-
通道关闭:数据传输完成后发送 CLSE 关闭 channel。
ADB 特点
-
多路复用:ADB 支持多个 channel 并行传输(例如 shell、文件传输、调试端口)。
-
可靠传输:通过 ACK/OKAY 确保数据可靠送达。
-
基于 USB Bulk 传输:确保大数据量传输稳定。
-
安全机制:通过 RSA 公钥认证防止未授权主机访问设备。
应用场景
-
调试应用(adb logcat, adb shell)
-
文件传输(adb push / pull)
-
远程安装 APK(adb install)
-
Bootloader 或 Recovery 模式调试
-
跨平台开发和设备自动化测试
当你启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程正在运行,如果没有,它会先启动服务器进程,服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令(所有 adb 客户端均通过端口 5037 与 adb 服务器通信)
然后,服务器会与所有正在运行的设备建立连接,它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器,服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接,请注意,每个模拟器都使用一对按顺序排列的端口(用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口)例如
模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推
-
我们通过Android Studio工具或者命令行界面直接或间接的调用某个adb命令,比如adb install或者adb devices
-
这时候adb进程会fork出一个子进程作为adb server,而这个fork出的进程将常驻PC端,监听来自Client端的请求
-
adb server查找当前连接的真机或者模拟器,并接收来自Client端发出的请求
-
adb server处理请求:如果是本地能直接处理的请求比如:adb devices就直接处理,如果是本地处理不了的请求就会转发给连接的真机或者模拟器来进行处理,可以通过数据线和TCP/IP的方式通信
-
位于真机或者模拟器后台的adbd进程接收到请求后,通过JDWP协议转发给对应的Java虚拟机进程处理
-
adbd将处理后的结果返回给adb server
-
adb server再将结果返回给Client,这时候我们就在命令行界面中看到展示结果了
基本使用方法
-
安装ADB:在电脑上安装Android SDK,其中包含了ADB工具。确保将其添加到系统环境变量中,以便在命令行中直接访问。
-
连接设备:通过USB将Android设备连接到电脑。确保设备开启了开发者选项和USB调试模式。
-
识别设备:在命令行中输入
adb devices
,如果设备正确连接,会显示设备的序列号。 -
安装应用:使用
adb install <应用路径>
命令,可以安装应用到设备上。 -
查看日志:通过
adb logcat
命令,可以查看设备的日志信息。 -
无线连接:通过
adb tcpip 5555
命令,可以将设备从USB模式切换到无线模式,通过TCP/IP进行连接。之后可以使用adb connect <设备IP>
进行连接。 -
安装APK:除了从本地文件系统安装APK,还可以从网络下载并安装APK。使用
adb shell wget <APK URL>
命令即可。 -
清除应用数据:使用
adb uninstall <应用包名>
命令可以卸载应用,但如果你想保留应用及其数据,可以使用adb uninstall -k <应用包名>
命令。 -
截屏和录屏:使用
adb shell screencap <截图路径>
可以截取设备的屏幕,而adb shell screenrecord <录屏路径>
则可以录制屏幕。 -
管理权限:使用
adb shell pm grant <应用包名> <权限名称>
可以为应用添加权限,使用adb shell pm revoke <应用包名> <权限名称>
则可以移除权限。 -
模拟按键事件:使用
adb shell input keyevent <键值>
可以模拟按键事件,如模拟按下Home键、电源键等。 -
文件管理:使用
adb pull <设备路径>
可以从设备上拉取文件,使用adb push <源路径> <目标路径>
则可以将文件推送到设备上 -
调试服务:使用
adb shell service list
可以查看设备上可用的服务列表,使用adb shell service <服务名称> <操作>
可以对服务进行操作。 -
安装测试脚本:可以使用
adb shell sh <脚本路径>
来运行存储在设备上的脚本文件。 -
查看电池状态:使用
adb shell dumpsys batterystats
可以查看电池的详细使用情况。 四、常见问题与解决方案 -
设备未正确连接:检查USB连接是否稳定,重新插拔USB线或更换USB端口尝试。确保设备开启了开发者选项和USB调试模式。
-
ADB未识别设备:尝试重启ADB服务,或在命令行中输入
adb kill-server
后再次尝试连接设备。确保驱动程序已正确安装。 -
应用安装失败:检查APK文件是否完整无损,尝试使用不同的APK安装工具或重新下载APK文件。
-
日志输出异常:检查日志输出是否被其他程序干扰,或尝试重启设备和电脑后再查看日志。
-
无线连接问题:确保设备已开启无线调试功能,并正确输入验证码进行连接。
-
权限问题:检查应用的权限是否正确配置,或尝试使用root权限执行相关操作。
-
其他问题:查看ADB的错误提示信息,根据提示查找解决方案或查阅相关文档和论坛获取帮助。 总结:ADB是一个强大且灵活的工具,通过掌握其基本原理和使用方法,开发者可以更高效地进行Android开发与调试。通过不断实践和探索高级技巧,可以更好地应对各种复杂的问题和需求。