Android 无法初始化 monitor Thread 并建立 loopback connection
结论
这两个错误通常来自同一条故障链:
-
Java 无法通过本机回环地址建立 socket 连接,因而报错:
Failed to initialize monitor Thread: Unable to establish loopback connection -
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 网卡通常配有流量控制或应用优先级组件,可以依次尝试以下操作:
- 退出或禁用 Killer Network Manager 中的带宽控制、应用监控和优先级功能。
- 在“程序和功能”中卸载 Killer Network Manager 等附加管理软件。
- 保留或重新安装网卡必需的基础驱动。
- 重新启动 Windows,再运行
LoopbackTest。 - 如果问题没有消失,更新网卡驱动,或暂时改用 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”之类的错误。
备注:内容仅供参考。
