如何在连接到远程系统的设备上部署和执行应用程序?

Posted

技术标签:

【中文标题】如何在连接到远程系统的设备上部署和执行应用程序?【英文标题】:How can I deploy and execute an application on a device connected to a remote system? 【发布时间】:2019-01-25 12:09:43 【问题描述】:

我需要在连接到同一网络中另一台机器的设备上部署测试应用程序并发出命令。

我通读了http://developer.android.com/tools/help/adb.html#directingcommands,但找不到答案。

我尝试使用adb connect <remote machine IP>,但出现unable to connect 错误。

有没有办法在连接到远程系统的设备上部署应用程序并执行adb 命令?

【问题讨论】:

【参考方案1】:

来自adbtag wiki:

Android Debug Bridge (adb) 是一个通用的命令行工具,它可以让 您与模拟器实例或连接的 Android 驱动的通信 设备。它是一个客户端-服务器程序,包括三个组件:

    在您的开发机器上运行的客户端。您可以通过发出 adb 命令从 shell 调用客户端。其他 Android 工具(例如 ADT 插件和 DDMS)也会创建 adb 客户端。 服务器,在您的开发机器上作为后台进程运行。服务器管理客户端和运行在模拟器或设备上的 adb 守护程序之间的通信。 一个守护进程,在每个模拟器或设备实例上作为后台进程运行。

adb connect 命令用于将本地adb 服务器 与网络连接设备上的adbd 守护进程 连接起来。但是你想要的是将本地adb client 连接到远程(在另一个系统上运行)adb serveradb 可执行文件的默认行为是连接到adb 服务器 的本地实例。如果没有找到它会尝试启动一个。这种方法适用于所有开发都在单个系统上完成的大多数环境。但在更复杂的环境中,它可能会导致多个adb server 实例被启动。而且因为adbd daemon 只支持一次连接到单个adb 服务器 - 该设备将被一个系统识别,并且在其他任何地方都会出现丢失。

因此,为了让adb 能够可靠地识别那些更复杂配置中的设备,您需要告诉adb 停止猜测并手动指定adb 的哪一部分(即服务器 或client) 应该在哪个系统上运行。

首先确保您在本地和远程系统上都安装了相同且足够新的 adb 版本(最新的 Google 官方版本通常效果最好)。并且当前没有adb 服务器在任一系统上运行。

然后使用以下命令在远程系统(您将插入设备的系统)上启动adb server 的实例:

adb -a -P <PORT_NUMBER> nodaemon server

现在您可以通过将-H &lt;REMOTE_IP&gt; -P &lt;PORT_NUMBER&gt; 添加到您的adb 命令来强制本地系统上的adb 客户端使用另一个(远程)服务器,而不是启动它自己的(本地)实例:

adb -H <REMOTE_IP> -P <PORT_NUMBER> devices

或者,在客户端设置ANDROID_ADB_SERVER_ADDRESS=&lt;REMOTE_IP&gt;ANDROID_ADB_SERVER_PORT=&lt;PORT_NUMBER&gt; 环境变量可以让您避免必须为每个adb 命令指定&lt;REMOTE_IP&gt;&lt;PORT_NUMBER&gt;

如果省略&lt;PORT_NUMBER&gt;,则默认为5037

这个用于adb 编排的官方内置解决方案并不是SSH 隧道 的互斥替代方案——它只是解决了另一个更重要的问题。您可以在此基础上添加隧道以增加额外的安全性或帮助解决多站点网络环境中的路由问题。但单靠隧道并不能解决所有adb 连接问题。

虚拟化环境也是如此 - 在 hostguest 系统之间运行多个 adb server 实例也会导致 adb 连接问题。

【讨论】:

感谢帮助。我们还可以在机器(或连接的设备)上创建 AVD,然后使用 andriod 平台工具连接到 AVD 感谢您的回答,这让我的目标看起来不再是不可能的了。有谁知道如何将此解决方案集成到 Android Studio 中? 这是我希望我可以多次投票的答案之一。正是我需要的,感谢您提供有关环境变量的信息。不过有一个问题 - 似乎两台计算机都需要运行相同版本的 ADB【参考方案2】:

也许这会有所帮助:

它是我几个月前专门针对远程 adb 命令开发的一个 java 库。基本思想是提供一些抽象层,在远程机器上可以类似地访问设备,因为它是本地连接的。看看吧:

https://github.com/lesavsoftware/rem-adb-exec

PS。它使用 SSH 隧道,所以应该足够安全。

【讨论】:

【参考方案3】:

如何使用 SSH 连接到您的设备所连接的机器并从那里发出 ADB 命令? 这至少是我们在公司中所做的事情,我们有几十个这样控制的设备。

【讨论】:

【参考方案4】:

使用 Android Studio,它会尝试连接到 localhost。 尝试设置 ANDROID_ADB_SERVER_ADDRESS,ANDROID_ADB_SERVER_PORT 在控制台中: netsh interface portproxy add v4tov4 listenport=ANDROID_ADB_SERVER_PORT listenaddress=127.0.0.1 connectport=ANDROID_ADB_SERVER_PORT connectaddress=ANDROID_ADB_SERVER_ADDRESS 并手动(使用工作室外部工具)连接到 adb

【讨论】:

以上是关于如何在连接到远程系统的设备上部署和执行应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在连接到 API(在 Yii 中)的移动应用程序(cordova)上启用跨域资源共享

VS code remote x11 在连接到远程服务器时无法显示

iPhone 在连接到 Mac 时显示问号(代替其图标)

远程部署/调试 Visual Studio 2017 .NET Core

React Native Android Fetch 在连接到本地 API 时失败

macOS微软远程连接工具