PAYATHON 2026

Android 无法初始化 monitor Thread 并建立 loopback connection

排障赵师傅

结论

这两个错误通常来自同一条故障链:

  1. Java 无法通过本机回环地址建立 socket 连接,因而报错:

    Failed to initialize monitor Thread: Unable to establish loopback connection
    
  2. SDK Manager 也无法连接 Google 的仓库,SDK Tools 下载不完整,随后 ADT 报错:

    Cannot find tools in the android-sdk folder
    

同一套配置在另一台电脑上可以使用,而出问题的桌面机装有 Bigfoot Killer 网卡,因此应优先排查这台电脑上的网络过滤组件,包括 Killer Network Manager、流量优先级软件、第三方防火墙、VPN,以及损坏的 Winsock 项。更换 Java 版本、修改编译级别,或将所有 32 位软件换成 64 位软件,通常无法解决这类 Socket Invalid argument: connect 错误。

但错误信息还不足以证明问题一定出在 Killer 网卡驱动上,需要通过以下检查确认。

为什么会同时出现两个错误

Android SDK 安装向导会先创建 SDK 目录,再从远程仓库下载工具包。连接失败时,目录虽然已经创建,其中却可能缺少 ADT 所需的文件,例如:

C:\android-sdk\tools\android.bat
C:\android-sdk\platform-tools\adb.exe

所以,“找不到 tools”既可能是 SDK 路径填写错误,也可能是下载失败后留下了空目录或不完整目录。

monitor Thread 需要通过 localhost 或 127.0.0.1 建立本机连接。某些网络过滤驱动会介入 Windows socket 调用链。一旦过滤组件异常,即使关闭 Windows 防火墙,Java 仍可能收到 Invalid argument: connect。

先检查回环网络

在命令提示符中运行:

ping 127.0.0.1
ping localhost

再检查 hosts 文件:

C:\Windows\System32\drivers\etc\hosts

其中至少应有可正常解析的 IPv4 项:

127.0.0.1 localhost

如果启用了 IPv6,也可以保留:

::1 localhost

排查期间不必长期关闭 IPv6。需要确认的是 localhost 能否正常解析,以及 Java 能否创建本地 socket。

可以直接运行下面的 Java 程序进行测试:

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class LoopbackTest {
    public static void main(String[] args) throws Exception {
        InetAddress address = InetAddress.getByName("127.0.0.1");
        ServerSocket server = null;
        Socket client = null;
        Socket accepted = null;

        try {
            server = new ServerSocket(0, 1, address);
            client = new Socket(address, server.getLocalPort());
            accepted = server.accept();

            System.out.println("Loopback connection succeeded on port "
                    + server.getLocalPort());
        } finally {
            if (accepted != null) accepted.close();
            if (client != null) client.close();
            if (server != null) server.close();
        }
    }
}

编译并运行:

javac LoopbackTest.java
java LoopbackTest

如果这段程序也报 SocketException 或 Invalid argument: connect,问题就在 Windows 网络栈、网络过滤软件或 Java 运行环境,不是 ADT 的 SDK 路径设置。

检查 Killer 网络管理软件

Bigfoot Killer 网卡通常配有流量控制或应用优先级组件,可以依次尝试以下操作:

  1. 退出或禁用 Killer Network Manager 中的带宽控制、应用监控和优先级功能。
  2. 在“程序和功能”中卸载 Killer Network Manager 等附加管理软件。
  3. 保留或重新安装网卡必需的基础驱动。
  4. 重新启动 Windows,再运行 LoopbackTest。
  5. 如果问题没有消失,更新网卡驱动,或暂时改用 Windows 能识别的基础驱动进行验证。

在设备管理器中禁用网卡,不一定会卸载已经注册到 Winsock 的过滤模块。“关闭网卡功能”和“移除网络过滤组件”是两种不同的操作。

第三方防火墙、杀毒软件的网络防护模块、VPN 客户端和代理软件也可以按这个思路排查。

修复 Winsock

卸载网络过滤软件后,如果仍然无法建立连接,请以管理员身份打开命令提示符,先查看 Winsock 目录:

netsh winsock show catalog

然后重置 Winsock:

netsh winsock reset

重新启动系统后再次测试:

java LoopbackTest

如果问题仍然存在,可以继续重置 TCP/IP:

netsh int ip reset C:\resetlog.txt

执行完毕后还要再次重启。

重置网络栈可能清除部分 VPN、代理、静态网络或安全软件配置。如果电脑依赖这些配置,请先记录当前设置。

检查代理和 SDK 仓库地址

只有网络确实需要通过代理访问时,才应填写 SDK Manager 的代理设置。不要随意配置一个不存在的代理服务器。

如果日志中的地址只是发布问题时删掉了 http:,可以忽略这种显示差异。如果 SDK Manager 的实际配置也缺少协议,就要恢复完整地址,例如:

https://dl-ssl.google.com/android/repository/repository-7.xml

“Force https:// sources to be fetched using http://”只能绕过旧环境中的 HTTPS 连接问题,无法修复本机 loopback 或 Winsock 故障,也不适合作为长期方案。

手动完成旧版 SDK 安装

如果暂时无法修复桌面机的联网问题,可以先在能够正常运行 SDK Manager 的电脑上安装所需组件,再复制整个 SDK 目录。

不要只复制空的 android-sdk 文件夹。复制的内容至少应包括旧版 ADT 所需的目录,例如:

android-sdk\
├── tools\
├── platform-tools\
├── platforms\
└── add-ons\

不同版本的 SDK 还可能包含:

build-tools\
extras\
system-images\

复制完成后,在 Eclipse 中打开:

Window -> Preferences -> Android

把 SDK Location 指向复制后的 SDK 根目录,例如:

C:\android-sdk

还要确认目录没有多嵌套一层。正确结构类似:

C:\android-sdk\tools\android.bat

不应是:

C:\android-sdk\android-sdk-windows\tools\android.bat

也可以下载与当时 ADT 版本配套的 SDK Tools 压缩包并手动解压,但必须选择匹配的旧版组件。当前 Android SDK 的目录结构已经发生变化,旧版 ADT 找不到传统的 tools 目录时,可能会拒绝识别。

关于 32 位和 64 位

Windows 7 x64 可以运行 32 位 Eclipse,但 Eclipse 与负责启动它的 Java 运行环境必须采用相同位数:

32-bit Eclipse -> 32-bit JRE/JDK
64-bit Eclipse -> 64-bit JRE/JDK

位数不匹配通常会使 Eclipse 无法启动或加载 JVM,很少表现为 Unable to establish loopback connection。Java compiler 设置为 1.6 只控制 Java 源码兼容级别,也无法修复网络连接。

如果需要明确指定 Eclipse 使用的 JVM,可以在 eclipse.ini 中加入:

-vm
C:\Java\jdk1.6.0_xx\bin\javaw.exe

-vm 和路径必须各占一行,并且位于 -vmargs 之前。

仍需使用 preferIPv4Stack 时

如果测试结果确认 IPv6 路径异常,可以在 eclipse.ini 的 -vmargs 后添加:

-vmargs
-Djava.net.preferIPv4Stack=true

这项设置只对启动 Eclipse 的 JVM 生效。单独双击运行的 SDK Manager 可能使用另一个 Java 进程,不一定会继承该参数。该参数也无法修复损坏的 Winsock 项或第三方网络过滤驱动。

当前环境的选择

ADT、Eclipse Android 插件和旧式 SDK Manager 都已停止维护。现在重新搭建 Android 开发环境时,应使用 Android Studio 和当前的 Android SDK Command-line Tools。

如果必须维护依赖 ADT 的旧项目,应保留一套能够配合使用的 Eclipse、ADT、JDK 和旧版 SDK,不要将旧版 ADT 直接指向当前 SDK。新旧工具的目录结构和兼容要求不同,混用时也可能出现“找不到 tools”之类的错误。

备注:内容仅供参考。