Android: 修复“adb server is out of date”错误





5.00/5 (1投票)
本文描述了 Android 开发者中常见的,由 Android 工具版本不兼容引起的问题,分析了原因并描述了一种解决方法。
引言
如果您在使用 HTC Sync 的电脑上通过 USB 调试 HTC 手机上的 Android 应用,您可能已经注意到调试时弹出的烦人消息。
adb server is out of date. killing...
* daemon started successfully *
该消息通常伴随着 3-5 秒的等待时间,并且在您成功开始调试之前可能会出现多次。更糟糕的是,有时它无法重启守护进程,并在等待 10-20 秒后以类似的消息中止启动。
adb server is out of date. killing...
* daemon started successfully *
** daemon still not runningerror: cannot connect to daemon
虽然这个问题看起来几乎是随机的,但它有一个简单的解释和一个干净的解决方法。
ADB 服务器
ADB 代表 Android Debug Bridge(Android 调试桥)。它是一个工具,Android 环境使用它来执行各种任务:列出连接的设备、在它们之间传输文件、建立 TCP/IP 连接…… HTC Sync 应用程序直接使用后一个功能通过 USB 与手机通信。
现在我们来看看当您连接手机并尝试调试它时会发生什么。
- HTC Sync(更具体地说,后台持续运行的 htcUPCTLoader.exe)检测到您已连接设备,并尝试将 TCP/IP 端口转发到该设备。为此,它运行其自身文件夹中的 adb.exe 并告诉它开始映射端口。adb.exe 持续在后台运行,为 HTC Sync 提供端口映射。
- 当您使用 Android SDK 开始调试时,它会执行几个小的任务(例如,列出设备、部署您的应用等),每个任务都涉及对其自身 adb.exe 的调用。当发生这种情况时,较新的 adb.exe 会检测到 HTC Sync 的旧 adb.exe 正在运行并终止它,然后运行它自己的实例。
- 后台运行的 HTC Sync 检测到端口映射已中断并尝试重新启动它。然后会发生什么?没错,Android SDK 的 adb.exe 被踢掉了。如果这种情况在 adb.exe 从 SDK 成功完成之前发生,您将收到错误消息,并且调试将失败。
解决方案
首先,我们需要找到干扰 Android SDK 的旧 adb.exe 实例。可以通过打开任务管理器、找到 adb.exe 并选择“属性”来完成此操作。请记住在执行此操作之前将手机连接到 USB。
一个简单的解决方案是删除/重命名 HTC Sync 使用的 adb.exe。但是,这将破坏 HTC Sync。
另一种方法是在您调试应用时杀死或暂停 htcUPCTLoader.exe。这将防止它干扰 Android SDK 的 adb.exe。
最后,您可以创建一个简单的存根,从注册表中读取实际 ADB.exe 的位置,并使用原始命令行运行它。
#include "stdafx.h"
#include <bzscore/Win32/registry.h>
using namespace BazisLib;
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t *p = GetCommandLineW();
if (p[0] == '\"')
p = wcschr(p+1,'\"');
else
p = wcschr(p, ' ');
if (!p)
p = L"";
else
p+=2;
wchar_t *pwsz = new wchar_t[512 + wcslen(p)];
String ADBPath = RegistryKey(HKEY_CURRENT_USER,
L"SOFTWARE\\Sysprogs\\ADBFix", 0, false)[L"SDKPath"];
if (ADBPath.empty())
ADBPath = L"adb_noadbfix.exe";
else
ADBPath += L"\\platform-tools\\adb.exe";
swprintf(pwsz, L"\"%s\" %s", ADBPath.c_str(), p);
STARTUPINFO info = {sizeof(info), };
PROCESS_INFORMATION PI;
CreateProcess(0, pwsz, 0, 0, 0, 0, 0, 0, &info, &PI);
WaitForSingleObject(PI.hProcess, INFINITE);
DWORD exitCode = -1;
GetExitCodeProcess(PI.hProcess, &exitCode);
return exitCode;
}
您可以将 HTC Sync 目录中的 adb.exe 重命名为 adb_noadbfix.exe,并将存根放在原始文件所在的位置。