在使用 React Native 开发时,Android 真机调试是最常见的场景之一。但很多开发者都遇到过这样的问题:代码修改后,手机频繁断开与 Metro Bundler 的连接,每次都要重新操作才能恢复。本文详细分析这个问题的根本原因,并给出两种解决方案。
目录
环境说明
- 开发机:macOS
- 调试设备:Android 真机(USB 连接)
- 工具:React Native + Metro Bundler + ADB
问题现象
每次修改代码后,Metro 推送热更新,终端出现以下警告:
Reloading connected app(s)...
warn No apps connected. Sending "reload" to all React Native apps failed.
Make sure your app is running in the simulator or on a phone connected via USB.
手机屏幕上 App 也随即显示无法连接到开发服务器的红屏错误。
根本原因
Metro 与 Android 真机的通信机制
Android 真机和 Mac 处于不同的网络环境。App 内部默认会向 localhost:8081 发起请求来连接 Metro Server。但在真机上,localhost 指向的是手机自身,而不是 Mac,所以无法直接通信。
adb reverse 命令解决了这个问题——它在 USB 上建立了一条反向端口隧道:
Android 手机 :8081 → (USB 隧道) → Mac localhost:8081
这样 App 访问自身的 8081 端口,流量就会被转发到 Mac 上运行的 Metro Server。
为什么每次修改代码后会断联?
当代码文件发生变更,Metro 检测到变化并向 App 推送热更新(Hot Reload / Fast Refresh)。这个过程中:
- App 与 Metro 之间的 WebSocket 连接短暂中断
adb reverse建立的端口隧道在此期间失效或需要重新握手- App 重新连接时,找不到有效的隧道,报告断联
本质上,adb reverse 的隧道不是持久可靠的,任何 USB 抖动、App 重启或 Metro bundle 重载都可能导致它失效。
方案一:重新执行 adb reverse(临时)
每次断联后,在终端重新运行:
adb reverse tcp:8081 tcp:8081
然后在手机上摇一摇唤出 Dev Menu,点击 Reload 即可恢复连接。
验证设备是否已被 ADB 识别:
adb devices
输出示例:
List of devices attached
10AF6M0XQT005JB device
如果状态是 device 说明连接正常,可以执行 adb reverse。
适用场景:临时调试、偶尔断联时快速恢复。
方案二:IP 直连(推荐)
让 App 直接通过 局域网 WiFi 连接 Mac 上的 Metro Server,彻底绕开 adb reverse,不再依赖 USB 隧道。
前提条件
手机和 Mac 必须连接在同一个 WiFi 网络下。
步骤
第一步:查询 Mac 的局域网 IP
ipconfig getifaddr en0
输出示例:
192.168.1.100
第二步:在手机上配置 Metro 地址
- 打开正在运行的 App
- 摇一摇手机,唤出 Dev Menu
- 进入 Settings → Debug server host & port for device
- 填入 Mac 的 IP 和端口:
192.168.1.100:8081
- 点击确认,回到 App,再次摇一摇选择 Reload
验证连接
连接成功后,Metro 终端会显示:
BUNDLE ./index.js
此后每次代码修改,热更新会通过 WiFi 直接推送,不再依赖 USB 隧道,也不会因为 adb reverse 失效而断联。
适用场景:长期开发、频繁修改代码、追求稳定连接。
常见问题
Q:adb devices 显示 unauthorized,怎么办?
手机上会弹出「是否允许 USB 调试」的对话框,点击允许即可。如果没有弹出,断开 USB 重新插入。
Q:IP 直连后,热更新还是很慢?
确认手机和 Mac 在同一局域网。如果使用了公司内网或路由器隔离了设备,可能无法直连,此时仍需使用 adb reverse 方案。
Q:同时有多台设备连接,adb reverse 报错?
指定设备序列号执行:
adb -s <设备序列号> reverse tcp:8081 tcp:8081
序列号可从 adb devices 输出中获取。
Q:Metro 端口不是 8081?
如果项目修改了 Metro 端口(如 8088),将所有命令中的 8081 替换为对应端口即可。
总结
| 对比项 | adb reverse(USB 隧道) |
IP 直连(WiFi) |
|---|---|---|
| 配置难度 | 低,一行命令 | 低,手机设置一次 |
| 连接稳定性 | 低,热更新后易断联 | 高,不依赖 USB |
| 前提条件 | USB 连接 | 同一 WiFi |
| 推荐场景 | 临时使用 | 日常开发 |
推荐的日常开发工作流:
- USB 连接手机(仅用于安装 App,或运行
adb install) - 配置 App 使用 Mac IP 直连 Metro(一次性配置)
- 之后拔掉 USB 也可以,只要保持同一 WiFi,热更新照常推送
最后更新:2026-02-26