如何通过TCP连接ADB到Android设备?

879

我试图在一台Motorola Droid上调试一个应用程序,但是通过USB连接设备时出了一些问题。我的开发服务器是运行在Hyper-V下的Windows 7 64位虚拟机,所以我不能直接通过USB从客户机或主机连接。

我安装了几个不同的USB-over-TCP解决方案,但是连接似乎存在问题,因为ADB监视器反复报告“devicemonitor failed to start monitoring”。是否有一种方法可以通过网络直接从开发机器上的客户端连接到设备上的守护进程,而不是使用USB连接或其他可行的选项?


75
当通过 USB 连接时:运行 adb tcpip 5555。拔掉 USB,从 设置 > 关于手机 > 状态 查看手机 IP。现在运行 adb connect 192.168.x.x 就可以了。无需工具、无需软件,轻松搞定。 - andreszs
1
Andrew所说的 - 这些是来自Google android developer website 的官方说明,无需root。在我的非root HTC One m8上正常工作(当然需要启用开发者选项)。 - Jeff Ward
@Andrew,我能否使用像这个这样的应用程序在没有计算机和无根访问权限的Nexus 6上打开和关闭端口?当我在公共网络上并且不使用手机进行开发时,我担心会出现安全问题,因为端口5555是开放的。 - DaveTheMinion
除非你能找到一种在手机本身上执行adb命令的方法,否则你需要使用电缆运行adb命令以更改端口。肯定有某种已获取root权限的命令行应用程序可以运行adb命令。 - andreszs
3
两种方法 - 如何通过 WiFi 运行 Android 应用程序 - 简单教程 - Athira Reddy
显示剩余6条评论
37个回答

29

首先,您必须通过USB连接您的设备。

然后将您的设备连接到WIFI并获取IP地址。 在仍然通过USB连接时,在命令行或Android Studio终端中键入以下内容:

adb tcpip 5555
adb connect <device IP>:5555
您将看到以下消息:
restarting in TCP mode port: 5555
connected to 172.11.0.16:5555

现在拔掉USB线,您仍然可以像平常一样查看您的logcat。

完成。享受吧。


这个方法有效。但是,在执行完这些步骤后,我无法再切换回模拟器。有什么建议吗? - Tim Scott
你需要使用以下命令重启adb: <adb kill-server> 然后 <adb start-server>。 - Thiago

21
如果您想要轻松地通过WiFi连接设备来运行、调试或部署Android应用程序,您可以使用我开发的开源IntelliJ插件。这里是代码(GitHub)和插件(JetBrains插件中心)

使用方法非常简单,请查看此GIF:enter image description here


发生了这个错误:"'adb'命令未找到。请检查您的Android SDK安装。 - rostamiani
1
你必须声明一个名为ANDROID_HOME的环境变量。但我有一个待审核的PR来避免这个问题。下周我将发布1.2版本,插件将只需要安装IntelliJ即可工作 :) - Pedro Vicente Gómez Sánchez
1
我已经发布了一个新版本,不再需要使用ANDROID_HOME环境变量。@powder366,你需要从IntelliJ插件商店安装插件,或者手动安装。安装和使用插件所需的所有说明都在项目自述文件中,可以查看https://github.com/pedrovgs/AndroidWiFiADB - Pedro Vicente Gómez Sánchez
@PedroVicenteGómezSánchez 谢谢。我选择了错误的插件,存在另一个名字类似的插件... - powder366
Moto G Play连接成功,但拔掉USB后,两个连接都终止了。顺便说一下,我已经与另一个设备连接了。 - RaRa
显示剩余2条评论

11

Brian表示:

根据xda-developers上的一篇文章,您可以使用以下命令在设备上启用无线ADB:

setprop service.adb.tcp.port 5555

stop adbd

start adbd

您也可以使用以下命令将其禁用并将ADB返回到USB监听:

setprop service.adb.tcp.port -1

stop adbd

start adbd

如果您已经可以通过USB访问设备,则更容易切换到使用WiFi。从与连接有设备的电脑的命令行中,发出以下命令:

adb tcpip 5555

adb connect 192.168.0.101:5555

要告诉ADB守护程序重新开始监听USB,请键入以下命令:

adb usb

Android市场上还有几个应用程序可以自动完成此过程。

它有效。您只需要访问安卓shell并键入这些命令即可...

另一个(更简单)的解决方案是在市场上寻找:adbWireless,它将自动设置您的手机。

两者都需要root权限!


2
...但前提是手机已经取得了root权限。 - android.weasel
华硕Transformer 301 - 工作无需root权限。 - Aiden Strydom

9
adb tcpip 5555

奇怪的是,只有在我连接了USB电缆后才能正常工作,然后我可以拔掉USB并使用其他adb功能。同样,在返回到USB时也是如此。
adb usb

只有在连接USB时才能正常工作。

无论我发出什么命令,都不会起作用。

setprop service.adb.tcp.port 5555

或者
setprop service.adb.tcp.port -1

然后停止并启动adbd,我仍然需要插入USB电缆才能使其正常工作。

因此,如果我的ADB通过USB无法正常工作,我打赌我也无法启用WiFi上的ADB。


8

Bash实用函数:

function adb-connect-to-wifi {
    ip="$(adb shell ip route | awk '{print $9}')"
    port=5555
    adb tcpip ${port}
    adb connect ${ip}:${port}
}

8
为了只使用一个命令在TCP和USB模式之间切换,您可以将以下内容添加到/init.rc中:
on property:service.adb.tcp.port=*
    restart adbd

on property:service.adb.tcp.enable=1
    setprop service.adb.tcp.port 5555

on property:service.adb.tcp.enable=0
    setprop service.adb.tcp.port -1

现在你可以使用属性service.adb.tcp.enable启用或禁用端口5555上的监听。运行netstat检查是否正在监听。正如您所看到的,如果您希望手动更改service.adb.tcp.port,它也会触发。


7

步骤一

确保您的 adb 主机电脑和 Android 设备都连接在同一个 WiFi 网络上。

步骤二

使用 USB 电缆将 Android 设备与计算机连接。一旦连接成功,您的主机电脑将检测到您的设备,并且 adb 将在计算机上以 USB 模式运行。您可以通过执行adb usb命令来确保 adb 正在以 USB 模式运行。同时,您也可以通过adb devices命令检查已连接的设备。

$ adb usb
restarting in USB mode
$ adb devices
List of devices attached
ZX1D63HX9R  device

步骤三

使用以下命令在tcpip模式下重新启动adb:

$ adb tcpip 5556
restarting in TCP mode port: 5556

步骤 4.

查找 Android 设备的 IP 地址。有几种方法可以实现:

  • 方法 1 进入「设置」->「关于手机/平板电脑」->「状态」->「IP 地址」。
  • 方法 2 进入可用 Wi-Fi 网络列表。找到已连接的网络,点击进入并查看您的 IP 地址。
  • 方法 3 尝试使用$ adb shell netcfg命令。

现在,您已经知道了设备的 IP 地址,请将您的 adb 主机连接到该地址。

$ adb connect 192.168.0.102:5556
already connected to 192.168.0.102:5556
$ adb devices
List of devices attached
ZX1D63HX9R  device
192.168.0.102:5556  device

步骤 5。

拔掉USB电缆,您应该已经连接到您的设备。如果在adb devices中没有看到它,那么只需使用前一步的命令重新连接:

$ adb connect 192.168.0.102:5556
connected to 192.168.0.102:5556
$ adb devices
List of devices attached
192.168.0.102:5556  device

要么你现在可以开始了,要么你需要执行adb kill-server 来终止你的adb服务器,然后再重新按照所有步骤进行一次。希望这能帮到你! 参考:

此外,您可以在Unix上使用此脚本获取设备的IP: adb shell ip -f inet addr show wlan0 | grep inet | echo -n $(grep -Eo '[0-9./]') | echo -n $(grep -Eo '^[^/]*') | sed 's/ //g' - ahsan.dev
@Eddy 有一个疑问,系统和移动设备/平板电脑必须通过WiFi连接,否则系统通过LAN连接,平板电脑通过相同网络的WiFi路由器连接。请澄清一下。 - iSrinivasan27
@i-Droid,我不知道为什么两个设备必须连接在同一网络中。也许ADB使用特殊的网络路由协议。我对此毫无头绪,并没有深入研究。如果您对此感兴趣,欢迎阐明并与我分享,谢谢! - Eddy

6

以下是我遵循的步骤,对我有效:

  1. adb shell ifconfig(从这里获取设备的IP地址)

  2. adb tcpip 7777(将adb连接到某个端口)

  3. adb connect“ipaddress”:7777


5

您还可以使用SSH本地端口转发。但仍需要使用USB电缆。将手机通过USB连接到运行sshd的计算机(主机)。在远程(客户端)PC上启动一个能够进行端口转发/隧道连接的SSH客户端。例如:

plink -L 5037:localhost:5037 <host_IP_address>

我使用这种方法将我的设备连接到虚拟机。Eltima USB转以太网不够稳定(在调试过程中会出现超时)。
SSH隧道可以免费使用,并且更加可靠。

4
我发现其他答案很令人困惑。使用adbWireless更简单:
只需在手机上安装一个应用程序来切换wifi调试,安装eclipse插件即可完成。 http://ppareit.github.com/AdbConnect/

你指的是哪个Eclipse插件?编辑:没事了。通过你的回答中的链接找到了它。 - ArtOfWarfare
这只是根节点而已。 - Zoe stands with Ukraine

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