PAYATHON 2026

Eclipse 向 Android 模拟器安装 .apk 时 timeout

排障赵师傅

结论

安装失败与 Eclipse、APK 签名、AndroidManifest.xml 或模拟器 API 版本无关。日志显示,问题出在 APK 上传阶段:

Uploading file onto device
write: timeout
Error during Sync: timeout

命令行执行 adb push 时也会挂起,说明 ADB 的文件传输通道,也就是 SYNC 通道,出现了问题。此时设备端的 Package Manager 还没有收到 APK,设备上自然找不到安装包。

模拟器和 USB 设备都会失败,但另一台电脑可以向同一设备安装,因此故障基本可以定位到这台 Windows XP 主机。建议优先检查以下几项:

  • 系统中是否存在多个版本的 adb.exe
  • 5037 端口上的 ADB server 是否异常
  • Winsock/TCP/IP 协议栈是否损坏
  • 防火墙、VPN、代理、安全软件或网络过滤驱动是否拦截本机通信

增大 Eclipse 的 DDMS timeout 只能延长等待时间,解决不了传输阻塞。

先确认失败发生在哪一层

退出 Eclipse,使用同一份 Platform-tools 中的 adb.exe 测试。如果连接了多个设备,需要用 -s 指定目标:

"C:\android\android-sdk\platform-tools\adb.exe" devices
"C:\android\android-sdk\platform-tools\adb.exe" -s emulator-5554 shell echo ok
"C:\android\android-sdk\platform-tools\adb.exe" -s emulator-5554 push temp.txt /sdcard/temp.txt

根据测试结果判断:

  • shell echo ok 成功,push 一直不返回,说明 ADB 基本控制通道正常,文件传输通道异常。
  • push 成功,install 失败,需要检查存储空间、签名、版本冲突和 Package Manager。
  • push 和 install 都失败,应先修复主机上的 ADB 或网络协议栈,不必继续调整 Eclipse。

当前症状符合第一种情况。

即使 adb shell monkey -v 100 可以执行,也不能说明 ADB 完全正常。ADB 的 shell、文件同步和安装使用不同服务,shell 可用与 SYNC 通道阻塞可以同时发生。

排除多个 ADB 版本或残留进程

Java、Eclipse、ADT、SDK Manager 及其他 Android 工具可能会启动不同目录中的 adb.exe。如果客户端连接到旧版或异常的 server,可能出现 device offline、无法停止 server 或传输挂起等问题。

先关闭 Eclipse、AVD Manager、SDK Manager 和手机管理软件,然后执行:

taskkill /F /IM adb.exe
netstat -ano | findstr 5037

如果 5037 端口仍被占用,根据 netstat 显示的 PID 查找对应进程:

tasklist | findstr PID

接下来只使用一个路径明确的 ADB:

"C:\android\android-sdk\platform-tools\adb.exe" start-server
"C:\android\android-sdk\platform-tools\adb.exe" devices
"C:\android\android-sdk\platform-tools\adb.exe" -s emulator-5554 push temp.txt /sdcard/temp.txt

还要搜索系统中的所有 adb.exe,看看旧 SDK、厂商工具或其他开发套件是否自带 ADB。同时确认 Eclipse 的 Android SDK Location 指向同一个 SDK 目录。

SDK Manager 如果报出以下错误:

Stopping ADB server failed (code -1).

说明正在运行的 ADB server 无法被当前工具正常控制,也符合上述判断。

查看 ADB 的详细日志

如果传输仍然挂起,可以在一个命令窗口中以前台方式启动 ADB server:

taskkill /F /IM adb.exe
set ADB_TRACE=all
"C:\android\android-sdk\platform-tools\adb.exe" nodaemon server

保留这个窗口,再打开另一个命令窗口执行:

"C:\android\android-sdk\platform-tools\adb.exe" -s emulator-5554 push temp.txt /sdcard/temp.txt

如果日志停在 socket 写入、SYNC 请求或本机连接操作上,应继续检查主机网络栈和过滤驱动,项目配置与这类问题无关。

修复 Windows XP 的 Winsock 和 TCP/IP

模拟器曾出现以下错误:

bind: Unknown error

加上模拟器和 USB 设备都受影响,主机的 socket 层、Winsock Provider 或网络过滤驱动更值得怀疑。即使设备通过 USB 连接,ADB client 和本机 ADB server 之间仍要通过本机 TCP 端口 5037 通信。

在具有管理员权限的命令提示符中执行:

netsh winsock reset catalog
netsh int ip reset resetlog.txt

执行完成后重启电脑,再启动 ADB:

"C:\android\android-sdk\platform-tools\adb.exe" kill-server
"C:\android\android-sdk\platform-tools\adb.exe" start-server
"C:\android\android-sdk\platform-tools\adb.exe" devices

先用一个很小的文件测试传输:

"C:\android\android-sdk\platform-tools\adb.exe" -s emulator-5554 push temp.txt /sdcard/temp.txt

确认成功后再测试 APK:

"C:\android\android-sdk\platform-tools\adb.exe" -s emulator-5554 install -r bin\MyAppCmd-debug.apk

重置 TCP/IP 可能会清除部分自定义网络参数。操作前应记录固定 IP、DNS、代理和企业网络配置,必要时先创建系统还原点。

检查网络过滤软件

仅在界面中关闭防火墙或安全软件,有时并不会卸载其 Winsock LSP、NDIS filter 或其他内核级过滤驱动。重点检查近期安装或升级过的软件,包括:

  • 防火墙和杀毒软件
  • VPN、代理和流量监控工具
  • 抓包、限速或网络加速软件
  • 手机同步和 USB 网络共享软件
  • 虚拟网卡、虚拟机网络组件

如果 Winsock 重置后问题暂时消失,安装某项软件后又再次出现,通常可以由此确定冲突项。必要时应完整卸载相关软件或网络过滤组件,单独停止其界面进程可能不起作用。

哪些现象与根因关系不大

Warning: No DNS servers found 表示拔掉网线后,模拟器无法取得 DNS 配置。通过 ADB 安装 APK 不依赖外部 DNS,所以这通常不是此次 timeout 的直接原因。

以下操作也很难解决当前问题:

  • 增大 Eclipse 的 ADB connection timeout
  • 清理 Eclipse 项目
  • 修改 minSdkVersion 或 targetSdkVersion
  • 删除并重新创建 AVD
  • 重新生成 debug key
  • 解锁模拟器屏幕
  • 调整 dx.bat 的堆内存

这些操作影响的是等待时间、构建、兼容性或签名。日志已经表明 APK 构建完成,错误发生在文件上传阶段。

清理重复的 ADB 版本、修复 Winsock 并移除有冲突的网络过滤驱动后,如果 adb push 能立即返回,Eclipse 中的安装通常也会恢复,不需要再修改项目或 ADT 配置。

备注:内容仅供参考。