在执行"adb reverse"命令时,两次收到"error: closed"错误提示。

53

我试图通过ADB进行反向转发端口,但它只返回error: closed的晦涩错误。正常的转发是可行的。会话片段:

$ adb forward tcp:59778 tcp:59778
$ adb forward --list
015d2109ce0c1a0f tcp:59778 tcp:59778
$ adb forward --remove-all
$ adb forward --list
$ adb reverse --list
error: closed
error: closed
$ adb reverse tcp:59778 tcp:59778
error: closed
error: closed

我正在使用 USB 连接非 root 的 Nexus 7 2012(Android 4.4.4)与运行在 Boot Camp 上的 Windows 7 Pro x64。

6个回答

98

adb reverse是在安卓5.0中引入的。


18
在使用Android 4.2时,解决方案是什么? - Augustin Riedinger
5
这是解决方案:http://facebook.github.io/react-native/docs/running-on-device-android.html#configure-device-to-connect-to-the-dev-server-via-wi-fi - Augustin Riedinger
5
@AugustinRiedinger,您提供的链接没有很清楚地说明如何在较低版本的API上替换adb reverse。以前,我可以手动在设备上设置服务器来开发React Native,但现在我遇到了一个错误,其中包括建议使用adb reverse,但是这种方法失败了,所以我不知道该怎么做。在设备上设置IP是否足以不需要其他替代方法?请帮我翻译一下,谢谢! - Giszmo
有用的提示:@alex-p 表示,使用 adb reverse 进行调试时,安装设备的 Android 版本不受支持。希望这能为其他人解决问题。我自己也花了几分钟才明白 :) 请注意,此选项仅适用于运行 Android 5.0+(API 21)的设备。 - talves
adb: 用法:reverse 需要一个参数 | 错误仍未解决。 - Walid Bousseta
显示剩余2条评论

35

由于 Android 版本低于 5.0 的设备不支持 adb reverse,因此您需要使用另一种替代方法,例如通过 Wi-Fi 连接。如果您正在使用 React Native,则 Facebook 已经添加了官方文档以通过 Wi-Fi 连接到开发服务器。以下是摘自 MacOS 操作系统的说明,但他们也适用于 Linux 和 Windows 操作系统:

方法二:通过 Wi-Fi 连接

您还可以通过 Wi-Fi 连接到开发服务器。您首先需要使用 USB 线将应用程序安装到设备上,但一旦完成后,您就可以按照以下说明进行无线调试。在继续之前,您需要知道开发机器的当前 IP 地址。

您可以在“系统偏好设置”→“网络”中找到 IP 地址。

确保您的笔记本电脑和手机连接到同一个 Wi-Fi 网络。 在您的设备上打开 React Native 应用程序。 您将看到一个带有错误的红色屏幕。这没关系。以下步骤将解决这个问题。 打开应用内开发人员菜单。 转到 Dev Settings → Debug server host for device。 输入您机器的 IP 地址和本地 dev 服务器的端口(例如 10.0.1.1:8081)。 返回开发人员菜单并选择 Reload JS。


运行得非常好!谢谢。 - KQI
最佳答案!!谢谢 - gatolgaj
5
注意:如果您像我一样正在开发不支持摇晃功能的Android 4设备(例如智能电视),仍然可以通过运行以下命令在设备上触发应用内开发人员菜单:"adb shell input keyevent KEYCODE_MENU"。 - yawl
1
如果您附近没有Wi-Fi网络,只需通过USB连接您的设备并使用分配给计算机端口的IP地址即可! - Janaka Bandara

13

请仔细按照以下步骤操作。

注意:所有命令都需要在项目中运行。

  1. 首先运行此命令:

  2. npm react-native start
    
  3. 在同一项目中打开另一个窗口并运行:

  4. curl "http://localhost:8081/index.android.bundle?platform=android" -o "android/app/src/main/assets/index.android.bundle"
    
  5. 这将在assets文件夹中创建index.android.bundle

  6. 运行:

  7. npm react-native run-android
    
    现在您可以在构建文件夹中获取APK,它将正常工作。

现在您可以在构建文件夹中获得APK,它将正常运行。


5
我认为应该使用'react-native start'和'react-native run-android'而不是'npm'。 npm 是用于包管理的工具... - Lzh

5

adb reverse 需要 Android 5.0+ 版本。对于早于此版本的设备,您需要使用以下解决方法。

如果您的 Android 设备上安装了 busybox(大多数 Genymotion 映像都有),则可以使用以下命令模拟 adb reverse

adb shell busybox nc -ll -p {guest port} -e busybox nc {host IP} {host port}

在这种情况下,“guest”是运行在模拟器中的 Android 操作系统,“host”是运行模拟器的计算机。


你能提供一个如何获取客户端端口、主机IP和主机端口的示例吗?我使用adb devices来获取客户端端口。然后我使用ifconfig en0来获取主机IP,然后我认为端口是8080,因为我正在使用react-native start --port=8080,但是我收到了“nc: bind Address is already in use”的错误提示。 - atkayla
如果两个设备没有连接到同一个网络,仅使用USB是行不通的。busybox nc所做的是隧道流。那么为什么不通过WiFi连接到单个网络,并相应地修改捆绑获取主机的IP地址以连接到开发机器呢? - iamawebgeek

2

如果您在 Android 5 以前遇到 adb reverse 不起作用的情况,您可以使用在 Android 上监听并通过此入站连接进行其他连接隧道传输的服务来代替。我大多数情况下都使用 SSH 进行此操作,但您需要在 Android 上安装 SSH 服务器。然后,您可以使用 ssh -R incommingreverseportonandroid:hostyouwanttoforwardto:portyouwanttoforwardto sshuseronandroid@localhost -p portyouhaveusedforadbforwaqrdtoaccessandroidssshserver 进行连接。

但我不知道如何在 Android 上启用 SSH 服务器,也许有更好的方法,因为 SSH 使用加密,这在 USB 上是不必要的,并会占用 CPU。

当我被迫在 NAT 后面时,我使用此方法与我的服务器共享服务...

希望有人能找到将这种理论方法转化为实际可能性的方法。


0

只需将主机名更改为10.0.2.2而不是localhost/127.0.0.1即可。它将直接尝试连接主机上的端口(与反向相同的效果)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接