React Native Android 真机调试连接断联问题详解


在使用 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)。这个过程中:

  1. App 与 Metro 之间的 WebSocket 连接短暂中断
  2. adb reverse 建立的端口隧道在此期间失效或需要重新握手
  3. 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 地址

  1. 打开正在运行的 App
  2. 摇一摇手机,唤出 Dev Menu
  3. 进入 Settings → Debug server host & port for device
  4. 填入 Mac 的 IP 和端口:
192.168.1.100:8081
  1. 点击确认,回到 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
推荐场景 临时使用 日常开发

推荐的日常开发工作流:

  1. USB 连接手机(仅用于安装 App,或运行 adb install
  2. 配置 App 使用 Mac IP 直连 Metro(一次性配置)
  3. 之后拔掉 USB 也可以,只要保持同一 WiFi,热更新照常推送

最后更新:2026-02-26