核心概念:ADB 网络连接的本质
要理解 ADB 的网络功能,首先要明白 ADB 本身是如何工作的,ADB 连接主要有两种方式:

- USB 连接 (最常用):通过 USB 数据线将手机连接到电脑,ADB 通过 USB 接口进行通信,这是最稳定、最可靠的方式。
- Wi-Fi 连接 (无线调试):通过 Wi-Fi 网络将手机和电脑连接起来,这在不方便插拔 USB 线时非常有用。
无论使用哪种连接方式,一旦 ADB 连接成功,你的电脑就获得了一个对 Android 设备的“Shell 访问权限”,所有网络命令,本质上都是在设备的 Linux Shell 中执行的,这就是 ADB 能进行各种网络操作的根本原因。
基础网络命令 (在设备上执行)
这些命令通过 adb shell 进入设备的命令行后执行,用于查看和管理设备自身的网络状态。
查看网络信息
-
查看所有网络接口的 IP 地址
adb shell ip addr show
- 常用缩写:
adb shell ip a
- 输出解读:你会看到
lo(loopback, 127.0.0.1)、wlan0(Wi-Fi)、rmnet_usb0(移动网络) 等接口,以及它们对应的 IP 地址。
- 常用缩写:
-
查看路由表
(图片来源网络,侵删)adb shell ip route show
- 常用缩写:
adb shell ip r
- 输出解读:显示数据包应该发往哪个网关。
default via 192.168.1.1 dev wlan0表示默认网关是168.1.1。
- 常用缩写:
-
查看 DNS 服务器
adb shell getprop net.dns1 adb shell getprop net.dns2
- 说明:Android 的 DNS 配置通常保存在系统属性中。
getprop命令用于读取这些属性。
- 说明:Android 的 DNS 配置通常保存在系统属性中。
-
检查网络连通性
# 从设备 ping 一个外网地址 adb shell ping www.google.com # 从设备 ping 电脑的 IP 地址 (前提是它们在同一网络下) adb shell ping 192.168.1.10
管理网络连接
-
开启/关闭 Wi-Fi
# 开启 Wi-Fi adb shell svc wifi enable # 关闭 Wi-Fi adb shell svc wifi disable
- 说明:
svc(Service Control) 是一个强大的系统命令,可以控制各种系统服务。svc wifi比settings put global wifi_on更可靠。
- 说明:
-
开启/关闭移动数据
(图片来源网络,侵删)# 开启移动数据 adb shell svc data enable # 关闭移动数据 adb shell svc data disable
-
切换飞行模式
# 开启飞行模式 adb shell settings put global airplane_mode_on 1 adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true # 关闭飞行模式 adb shell settings put global airplane_mode_on 0 adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false
- 说明:只修改
airplane_mode_on的值是不够的,还需要发送一个广播来通知系统更新状态。
- 说明:只修改
ADB 自身的网络功能 (在电脑上执行)
这部分是 ADB 的“独门绝技”,允许你通过网络直接与设备上的特定服务通信。
端口转发
这是 ADB 最核心的网络功能,允许你将电脑上的一个端口映射到设备上的一个端口。
-
语法:
adb forward <local> <remote>
<local>:你电脑上的一个 TCP 端口号。<remote>:设备上的一个 TCP 端口号或 Unix 域套接字。
-
常用场景:
- 调试 Web 应用:如果你在设备上运行了一个 Web 服务器,监听
localhost:8080,你可以将电脑的8090端口映射过去。adb forward tcp:8090 tcp:8080
然后你就可以在电脑浏览器中访问
http://localhost:8090来查看设备上的 Web 服务。 - 连接到应用的调试端口:一些应用(如 Chrome、自定义服务)会暴露调试端口,连接到 Chrome 的远程调试端口:
adb forward tcp:9222 localabstract:chrome_devtools_remote
然后访问
http://localhost:9222就能看到 Chrome 的 DevTools 设备列表。
- 调试 Web 应用:如果你在设备上运行了一个 Web 服务器,监听
-
列出和删除转发规则
# 列出所有当前的转发规则 adb forward --list # 删除一个特定的转发规则 adb forward --remove tcp:8090 # 删除所有转发规则 adb forward --remove-all
Wi-Fi 连接 (无线 ADB)
这是实现 ADB 无线操作的关键。
-
前提条件:
- 手机和电脑连接到同一个 Wi-Fi 网络。
- 手机上已开启 USB 调试。
-
操作步骤:
- 通过 USB 连接设备:
adb devices
确认设备已连接并授权。
- 获取设备的 IP 地址:
adb shell ip addr show | grep "wlan0"
找到类似
inet 192.168.1.100的 IP 地址。 - 配置端口转发:
adb tcpip 5555
这会断开 USB 连接,并让设备在
5555端口上监听 TCP 连接。5555是 ADB 的默认端口。 - 通过 Wi-Fi 连接:
adb connect <设备IP地址>:5555
adb connect 192.168.1.100:5555 - 验证连接:
adb devices
如果看到
<设备IP>:5555设备,并且状态为device,则表示连接成功,之后你就可以像使用 USB 连接一样使用adb shell、adb install等所有命令了。
- 通过 USB 连接设备:
-
断开无线连接:
adb disconnect <设备IP地址>:5555
或者直接
adb disconnect会断开所有无线连接。
高级应用场景
抓取网络包
在开发或调试中,抓取网络包是分析问题的利器。
-
使用
tcpdump(需要提前安装):- 在手机上下载
tcpdumpfor Android (例如从 here)。 - 将
tcpdump推送到设备的/data/local/tmp/目录并赋予可执行权限:adb push tcpdump /data/local/tmp/ adb shell chmod 755 /data/local/tmp/tcpdump
- 启动抓包(只抓取 wlan0 接口,并保存到
/sdcard/capture.pcap):adb shell "/data/local/tmp/tcpdump -i wlan0 -w /sdcard/capture.pcap"
- 在手机上复现你要抓包的操作。
- 停止抓包(按
Ctrl+C)。 - 将抓取的包文件拉取到电脑上分析:
adb pull /sdcard/capture.pcap .
- 使用 Wireshark 等工具打开
capture.pcap文件进行分析。
- 在手机上下载
-
使用 Android Studio 的 Profiler: 这是更简单、更集成的方案,在 Android Studio 中,打开你的项目,点击底部的 Profiler 标签页,选择你的设备和应用,在 Network 标签页中,你可以实时查看应用的 HTTP/HTTPS 请求,包括请求方法、URL、状态码、请求/响应头和耗时,这对于分析 App 的网络行为非常直观。
模拟网络环境 (限制网速、延迟、丢包)
在开发时测试应用在网络不佳情况下的表现非常有用。
-
使用
tc(Traffic Control):tc是 Linux 内核中的流量控制工具,很多 Android 设备(尤其是 rooted 设备或 AOSP 设备)都包含它。-
限制上行带宽为 1Mbps,延迟 100ms,丢包 1%:
# 假设网络接口是 wlan0 adb shell "tc qdisc add dev wlan0 root netem rate 1mbit latency 100ms loss 1%"
-
取消限制:
adb shell "tc qdisc del dev wlan0 root"
-
注意:此命令需要
root权限才能执行,并且不是所有设备都支持tc。
-
故障排查
-
adb: no devices/emulators found- 检查 USB 线是否完好,是否连接到正确的 USB 端口。
- 在手机上检查“关于手机” -> “版本号”,连续点击 7 次“开启开发者选项”。
- 在“开发者选项”中,确保“USB 调试”已开启。
- 如果是无线连接,确保手机和电脑在同一 Wi-Fi 下,并且防火墙没有阻止连接。
-
adb: error: failed to get feature set: no devices/emulators found这个错误通常表示物理连接存在问题,但设备被部分识别,尝试换一根 USB 线或 USB 端口。
-
无线连接后
adb: connect failed: unable to connect to <IP>:5555: Connection refused- 确保设备 IP 地址正确。
- 确认设备上
tcpip 5555命令已经执行成功,可以尝试重新执行一遍adb tcpip 5555。 - 检查电脑和手机的防火墙设置,可能阻止了
5555端口的连接。
-
端口转发不生效
- 使用
adb forward --list确认规则是否正确添加。 - 检查目标应用是否在监听正确的端口。
- 某些系统或应用可能需要
root权限才能被访问。
- 使用
| 功能类别 | 核心命令 | 主要用途 |
|---|---|---|
| 基础网络 | adb shell ip a/r, adb shell ping |
查看设备自身网络状态、IP、路由、连通性。 |
| 网络控制 | adb shell svc wifi/data [enable\|disable] |
通过代码或脚本开启/关闭 Wi-Fi 和移动数据。 |
| 端口转发 | adb forward <local> <remote> |
将电脑端口映射到设备端口,用于调试本地服务、Web 应用等。 |
| 无线连接 | adb tcpip 5555, adb connect <ip>:5555 |
实现 ADB 的无线调试,摆脱 USB 线缆束缚。 |
| 网络抓包 | adb shell tcpdump, Android Profiler |
分析应用的 HTTP 请求和底层网络流量,定位网络问题。 |
| 网络模拟 | adb shell tc qdisc ... (需 Root) |
模拟慢速、高延迟、丢包的网络环境,测试应用健壮性。 |
掌握这些 ADB 网络功能,将极大地提升你开发和调试 Android 应用的效率,希望这份指南对你有帮助!
