如何通过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个回答

3
这是对Brian的回答的一个扩展,使用蓝牙:
  1. On Linux, use Blueman to share PC internet with your device via Bluetooth:

    $ sudo apt-get install blueman
    $ blueman-manager
    Pair them: Search devices after enabling Bluetooth
    on your phone and making it visible
    $ blueman-services
    Network > [X] Network Access Point (NAP)
    Your Phone > Settings > Bluetooth > Paired Device > [X] Internet access
    
  2. Use the Bluetooth network for ADB commands:

    $ adb tcpip 5555
    $ adb connect $(adb shell ip -f inet addr show bt-pan | egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n1):5555
    

完成后返回USB模式:

$ adb disconnect
$ adb usb

注意:蓝牙3.0和4.0可达到24 Mbit/s的速度

3
我编写了一个批处理文件,可通过TCP自动启用并连接ADB到通过USB连接的设备。使用它,您无需手动输入IP地址。
@echo off
setlocal

REM Use a default env variable to find adb if possible
if NOT "%AndroidSDK%" == "" set PATH=%PATH%;%AndroidSDK%\platform-tools

REM If off is first parameter then we turn off the tcp connection.
if "%1%" == "off" goto off

REM Set vars
set port=%1
set int=%2
if "%port%" == "" set port=5557
if "%int%" == "" set int=wlan0

REM Enable TCP
adb -d wait-for-device tcpip %port%

REM Get IP Address from device
set shellCmd="ip addr show %int% | grep 'inet [0-9]{1,3}(\.[0-9]{1,3}){3}' -oE | grep '[0-9]{1,3}(\.[0-9]{1,3}){3}' -oE"
for /f %%i in ('adb wait-for-device shell %shellCmd%') do set IP=%%i

REM Connect ADB to device
adb connect %IP%:%port%

goto end

:fail
echo adbWifi [port] [interface]
echo adbWifi off
goto end

:off
adb wait-for-device usb

:end

3

步骤:

  1. su -- 切换到超级用户。
  2. setprop service.adb.tcp.port 5555 - 指定tcp端口 - 这里的端口号为5555
  3. stop adbd - 停止adbd服务。
  4. start adbd - 启动adbd服务。

这在我的Windows PC上通过ssh完美运行。

我试图在我的青春版手机上启动此程序或使用plink启动此程序。使用plink时,无法使用su命令启动shell...sudo或su命令不起作用。在启动时我不知道它是如何工作的! 我的shell程序可以通过ssh与最后三个命令(不包括su)一起使用su -c“sh /storage/sdcard1/start_adb.sh”

谢谢


2

我遇到了相同的问题,但是一个简单的hack adb reverse tcp:<PORT> tcp:<PORT> 对我有用。它允许系统接受tcp请求。

谢谢阅读


2

额外提示(从失败中学到的):您不应同时启用公司VPN连接...


2

您需要完成以下步骤:

  • 首先,将ADB添加到您的环境路径中。
  • 在CLI中键入以下命令:adb connect YOUR_DEVICE_IP:PORT_NUMBER(例如adb connect 192.168.100.100:5555

2

有两种方法可以通过TCP连接将您的Android设备与ADB连接?

第一种方法

按照以下步骤进行操作:

首先使用以下命令获取您的设备IP地址

adb shell ifconfig

以上命令的输出如下:
wlan0     Link encap:UNSPEC    Driver icnss
          inet addr:XXX.XXX.X.XX  Bcast:XXX.XXX.X.XXX

使用以上命令,您将找到已连接设备的IP地址。

现在使用以下命令

adb tcpip 5555

以上命令将重新启动此TCP端口:5555

现在使用以下命令连接您的设备

adb connect XXX.XXX.X.XXX:5555
            ^^^ ^^^ ^ ^^^
        IP Address of device

第二种方法

您可以使用Android Studio插件 Android设备与ADB

Android WiFi ADB - IntelliJ/Android Studio Plugin

这是一个IntelliJ和Android Studio插件,旨在快速连接您的Android设备通过WiFi安装、运行和调试应用程序,无需USB连接。按下一个按钮,就可以忘记您的USB电缆。

请查看此文章以获取更多信息

在Android Studio中使用WiFi连接Android设备


1

adb可以通过TCP套接字与adb服务器通信。您可以通过telnet验证此功能。

$ telnet 127.0.0.1 5037
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
000chost:version
OKAY00040020

一般来说,命令的格式为%04x%s with <message.length><msg>。以下是Ruby命令,它通过TCP套接字socket发送ADB命令cmd
def send_to_adb(socket, cmd)
  socket.printf("%04x%s", cmd.length, cmd)
end

第一个示例发送命令host:version,长度为12(十六进制表示为000c)。 您可以尝试更多有趣的命令,例如framebuffer:,它可以从帧缓冲区中获取屏幕截图,正如其名称所示。


这是很酷的信息,但它并没有回答问题。adb服务器是主机端的,而问题是要求如何通过无线方式与设备通信。(adb服务器存在的原因是在单个主机到设备传输中多路复用adb主机会话,通常是USB端点。) - Ian Ni-Lewis

1

如果有帮助的话,我写了一个.bat文件来帮我完成这项工作。

我正在使用Visual Studio / Xamarin - 只需将手机连接到USB,运行批处理文件,选择“C”进行连接,完成后,断开手机与USB电缆的连接。从那里开始,您将通过Wifi连接。

注意:在脚本中更改目录为adb.exe在您的PC上存在的位置,并编辑您手机的IP地址。

@echo off
cls
c:
cd\
cd C:\Program Files (x86)\Android\android-sdk\platform-tools\

:choice
set /P c=Do you want to connect or disconnect[C/D]?
if /I "%c%" EQU "C" goto :connect
if /I "%c%" EQU "D" goto :disconnect
goto :choice


:connect
echo plug phone in via USB. Make sure emulator is switched off
pause
adb tcpip 5555
adb connect 192.168.0.32:5555
echo finished - unplug USB
pause
exit

:disconnect
adb usb
echo finished - ADB is reset to USB mode
pause

希望能对某人有所帮助!

1
使用adbwireless应用程序启用手机,然后从Windows机器使用adb connect与其通信。手机上的adbwireless应用程序会告诉您如何连接它,并提供IP地址等信息。
更不好玩的替代方法是通过USB连接,告诉手机使用adb tcpip 5555进行TCPIP连接,然后断开USB连接,再使用adb connect。这种方式更加困难,因为这样你必须自己找到手机的IP地址(adbwireless会告诉你IP地址),你必须通过USB连接,还必须运行adb tcpip(adbwireless也会处理这个)。
所以:在您的手机上安装adbwireless。使用它。这是可能的,我在Linux和Windows上经常这样做。

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