ADB:规范中缺少端口

ADB: missing port in specification

我最近升级到 Android SDK 平台工具版本 28.0.2。版本信息:

$ adb version
Android Debug Bridge version 1.0.40
Version 28.0.2-5303910

当使用 adb connect 命令时,我现在收到以下错误:

$ adb connect 192.168.1.20
missing port in specification: tcp:192.168.1.20

ADB 之前默认使用 TCP 端口 5555 连接到设备。我仍然可以通过指定此端口号连接到我的设备:

$ adb connect 192.168.1.20:5555
connected to 192.168.1.20:5555

但是,这对我来说有点不便,因为我习惯于只输入 IP 地址。有没有办法告诉这个版本的 ADB 默认使用 TCP 端口 5555?

更新

从 ADB 版本 1.0.41 开始,该错误现已修复,它是平台工具版本 29.0.4 的一部分。该错误的修复已在 31st July 2019:

上提交

Restore default port for adb connect.

The default port of 5555 was removed a while back, but the help text was never updated, and other contexts still allow a default port.

Bug: https://issuetracker.google.com/128561172

输入 adb connect 192.168.1.20 不带尾随端口号现在会导致 ADB 连接到目标设备,恢复以前的行为。

旧答案

这似乎是 ADB 内部的一个错误,于 2018 年 12 月或 2019 年 1 月引入。我认为这与 socket_spec.cpp 中此 else 声明的最近更改有关。

} else {
    std::string addr(spec.substr(4));
    port_value = -1;

    // FIXME: ParseNetAddress rejects port 0. This currently doesn't hurt, because listening
    //        on an address that isn't 'localhost' is unsupported.
    if (!android::base::ParseNetAddress(addr, &hostname_value, &port_value, serial, error)) {
        return false;
    }

    if (port_value == -1) {
        *error = "missing port in specification: ";
        *error += spec;
        return false;
    }
}

如果未指定端口值,则变量 port_value 初始化为 -1 并且不会更改。 android::base::ParseNetAddress 也不会更改此值。如果 ParseNetAddress 检查通过,那么我们总是会立即陷入错误捕获语句。

$ adb kill-server
$ adb connect 192.168.1.20

杀掉adb服务器,正常连接。默认端口 (5555) 在服务器重新启动时恢复。

我可以通过在后缀位置添加端口号来连接我的 android phone。

例如,

$ adb kill-server

$ 亚行连接 192.168.1.20:5555

直接连接不上,报上面的错误

注意:端口号是必须要申请的,可能你当前的端口号不一样,请查到后再尝试连接。

刚刚在 AndroidThings 设备上标记了这个,

不得不交换

 adb connect Android.local

 adb connect Android.local:5555

还有另一种解决方法,归功于 Google 问题线程中的 this unknown person。创建自动将默认端口号添加到 IP 地址的自定义别名。

对于 Linux 和 MacOS,在 ~/.bashrc~/.bash_aliases 中:

function adbc() {
   adb connect :5555
}

然后使用命令连接

$ adbc 192.168.1.20

Windows 用户:

Put this in adbc.bat anywhere in your PATH

@echo off
adb connect %1:5555

然后使用命令连接

> adbc 192.168.1.20

为 Android 设备设置端口将解决问题。

方法如下:

  1. 通过 USB 将 Android 设备连接到安装了 adb 的计算机(Linux、MacOs 或其他)。
  2. 执行adb tcpip <port_number>。这会将设备设置为端口为 TCP 模式,尽管设备当前可能未使用以太网或 WiFi。这将使 port_value 不等于 -1 或未定义。
  3. 通过 USB 断开 Android 设备与计算机的连接。
  4. adb connect <IP address>:<port number> 这应该连接设备。该设备应显示在 adb devices.
  5. 的结果中

当我 "adb over Ethernet" 和 "adb over wifi" 使用我的 Pixel 3 XL 时它对​​我有用。

我在搜索与 Android 的 Visual Studio 模拟器类似的问题时偶然发现了这个线程。当您尝试拖放 *.apk 文件进行安装时,它给您同样的错误

我通过下载 latest -working- platform-tools v27.0.1 from google 并替换 android SDK 文件夹中的内容来修复它(在我的例子中是 %LOCALAPPDATA%\Android\Sdk)。

我知道,这不是最好的解决方案,但只要 google 没有发布固定的 adb 版本(仍然不是 v29.02),我就可以接受它。