如何设置ADB以进行远程机器开发和本地设备部署

51
我的情况是这样的:我在家里远程办公,通过Windows远程桌面登录我的工作电脑。我在工作电脑上使用Eclipse作为我的Android应用开发环境。
使用ADB,我希望能够将应用程序从我的工作电脑部署到我家庭网络上的设备上,以满足模拟器无法完全展示应用的情况。
我找到了这篇帖子,讨论了一个非常类似的情况,只是将应用部署到本地PC上运行的模拟器,而不是部署到本地设备上: Android: ADB远程模拟器访问 我正在尝试采取相同的步骤,但是想弄清楚如何将目标定位在我家Wi-Fi网络上的本地设备上,以及与我本地家用PC进行连接,而不是本地模拟器。

现在,我已经设置了远程PC,尝试连接到我的公共路由器IP地址的5585端口,但是在我的路由器中,我需要将这个IP地址/端口转发到哪个本地设备来连接?

在使用模拟器的示例中,他们将转发到运行模拟器的本地PC地址和5555端口,而本地PC上没有运行ADB。我已经配置了我的路由器,将转发到我的设备IP地址,设备连接的是Wi-Fi,以及我的本地PC IP地址,设备通过它进行连接。

然而,在这两种情况下,当我在远程PC上尝试使用adb connect <router_IP_address>:5585时,它给我一个错误无法连接到<router_IP_address>:5585:5585。当尝试转发/监听其他端口时,我得到相同的响应。在路由器日志中,我没有看到任何安全错误,所以看起来端口转发是正常工作的。

问题:

我在本地网络上配置端口转发以使用远程ADB实例连接到本地设备时,应该将本地IP地址/端口号转发到哪里? 我应该以设备连接的本地PC IP地址为目标,还是以本地设备IP地址为目标? 如果我以本地设备IP地址为目标,应该转发到哪个端口号? 我需要在本地PC上运行ADB吗?

1
你为什么不把apk复制到本地机器上,然后从那里部署呢? - Abdullah Jibaly
据我所见,根据这里的内容:https://dev59.com/PnE85IYBdhLWcg3wzW3M,adb connect 应该针对实际的 Android 设备 IP。 - Abdullah Jibaly
@AbdullahJibaly 将 APK 文件复制到本地是一种选择,但在迭代开发过程中并不是非常高效的方法。我更喜欢直接使用 ADB,这样可以省去编译和应用程序出现在设备上之间的许多步骤。 - Sean Barbeau
@AbdullahJibaly,您列出的帖子上没有批准的答案,所以我不确定该怎么做。此外,这些响应似乎也需要root权限-我想在原始设备上执行此操作。当我尝试“adb tcpip 5555”进行重定向时,它只是停留在“正在重定向”的消息处,不会返回提示符。 - Sean Barbeau
7个回答

51
我有一个类似的情况。我在远程桌面上进行开发工作,但我的安卓设备连接到我的本地笔记本电脑。我希望能够在远程桌面上使用ADB和Eclipse中的安卓插件,并连接到连接在我的笔记本电脑上的设备。在互联网上搜索了一番,没有找到真正有用的东西,于是我决定编写一个端口转发器来解决这个问题。你可以在这里找到它here

3
项目已经迁移到了Bitbucket。你可以在以下网址找到它:https://bitbucket.org/chabernac/adbportforward/wiki/Home - Guy Chauliac
1
我按照您在上面的Bitbucket链接中建议的步骤进行了操作,我的连接已经设置完成,但是一旦我运行adb命令,例如adb devices,我会收到以下错误消息:167838 [pool-1-thread-2] ERROR chabernac.portforward.PortForward - 在设置与10.94.14.132:6037的连接时发生错误java.net.ConnectException: Connection refused: connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress............. - roger_that
2
@GuyChauliac,太好了!运行非常顺利。但是有些系统无法启动作为客户端,它们可以成功ping通服务器,可以充当服务器,但是当我发出客户端命令时,它会在“Android ADB client started: true”后卡住,即使服务器处于就绪状态也没有更新。 :( - jQueen
1
我在Linux虚拟机中编码,因此无法在客户操作系统上运行HAXM模拟器,但是通过这种解决方法,我可以将其部署到在主机上运行的HAXM模拟器!感谢您提供这个解决方案! - Vicky Chijwani
工作正常,但我在服务器机器上遇到了问题,路径不支持空格,例如:C:\adb file\ < 不起作用,但 C:\adbfile\ < 起作用。=( 你能更新脚本吗,@GuyChauliac? - Florida
显示剩余13条评论

26

从Android 4.3开始,您可以:

  1. 使adb服务器监听所有接口。您有两个选项:
    • gListen=1并重新编译adb(我已经在Linux-x64机器上为您编译了它,并将其放在这里
    • 使用-a参数启动adb服务器:adb -a -P 5037 fork-server server&
  2. 在远程计算机上使用带有额外参数的adb,例如:adb -H <remote_host> shell

2
感谢您的替代方法!为了澄清-这是否需要 Android 设备为 4.3 或更高版本?还是需要使用与 Android 4.3 发布的 SDK 工具? - Sean Barbeau
我刚测试了一下,使用2.3版本的姜饼设备,运行良好。 - kar
这个可以用,但是将文件推送到模拟器上非常慢(例如adb install非常慢)。这不是网络或SSH问题,因为rsync正常工作。有什么建议吗? - amfcosta
有人可以提供一个使用选项2使其工作的示例吗? - AlexIIP
非常好的答案,正是我正在寻找的内容。末尾的'&'可以删除。 - Swing

13
另一种远程主机+本地设备测试的设置。这对于许多在家办公的人来说非常有用,他们使用笔记本电脑连接到仍在办公室的开发主机。请注意,我假设开发主机/笔记本电脑都在运行Unix,但其他操作系统也可以在命令提示符/Shell上运行命令。
# Kill the old ADB server.
adb kill-server

在笔记本电脑上

# Activate ADB server on the client
adb start-server

# Start an SSH tunnel. Hide/minimize this window to not close it by accident
ssh -XC -R 5037:localhost:5037 <your development host machine>

在开发主机上

# It should work by now with the local device connected to the laptop
adb logcat

1
这绝对是最好的解决方案。 - distante
在我的情况下,使用QT Creator时,它还会尝试使用端口5039,一旦应用程序部署(确实如此),移动设备就会在端口8100上等待调试器,有什么想法吗? - Vega4
真棒。已确认在Windows的WSL上也可以工作。 - Jun
它有效,我可以使用“adb shell”连接,但如何将它们带入AndroidStudio设备下拉列表以便在其上进行调试? - hannes ach
唯一的问题是,ssh 的 -XC 参数似乎与解决方案无关。 - Slava

5

以下是我如何从macOS主机上的模拟器使其与macOS客户端配对。

A: 一行命令

在模拟器的主机上

 socat tcp-l:5560 tcp:localhost:5559

在客户端

 adb connect <IP>:5560

使用隧道

在主机上

host$ adb kill-server
host$ adb -a nodaemon server

在客户端

client$ adb kill-server
client$ ssh -L 5037:localhost:5037 <host-IP>

在客户端上打开第二个shell

client$ adb kill-server  # I observe first it kills client adb
client$ adb kill-server  # then it kills server adb, do it maybe once more
client$ adb devices      # show devices on server now

现在我也在Android Studio中看到了主机模拟器。

输入图像描述


非常好的回答,真的非常感谢。为了这个问题,我在网上搜了一整晚,一直到早上。 - a55

5

您可以通过端口转发解决此问题。

  • 从Chrome应用商店下载Secure Shell应用程序
  • 连接到您的机器(逐步设置)
  • 在此连接中,禁用adb服务器:adb kill-server
  • 创建一个新的端口转发连接(与普通连接相同,但将SSH参数字段设置为:-N -R 5037:localhost:5037)
  • 在您的笔记本电脑上,打开终端并启用adb服务器:adb start-server

非常有用的指导。但请注意,只有在本地和远程计算机上的adb版本相同时才能使用此方法。 - Ajay

5
也许有一种更简单的解决方案,只要设备、本地机器和远程机器属于同一网络。比如说,您的设备在网络上有一个特定的IP地址,假设您决定使用首选端口:那么,您可以按照以下步骤操作。在连接设备的计算机上运行以下命令:
adb devices

adb tcpip <PORT>

PORT的示例是5555。

在远程计算机上,您需要禁用“发现USB设备”、“发现网络目标”和“端口转发”,然后运行:

adb connect IP:PORT

*IP是您的Android设备IP地址(不是第一台机器的IP地址),可以通过adb shell ip -f inet addr获取。

现在您已经准备好在远程机器上进行调试了。


它与RDP相关,但我如何查看设备列表?adb devices没有显示任何内容。 - NajiMakhoul

2
我的情况需要使用位于不同网络的虚拟机,但我通过远程桌面连接到它(一个Azure虚拟机)。这台虚拟机和我的本地笔记本都运行着Windows 10。首先,我需要在本地安装USB Redirector RDP Edition(需要花费80美元,但也许有免费替代品),然后在虚拟机上安装Google Android USB驱动程序以及通用Adb驱动程序。现在,我可以在虚拟机上加载Android Studio应用程序,在笔记本上连接Android设备并对设备上的应用程序进行调试。

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