Android上"adb server is out of date"bug的解决方法

标签: Android
发布时间: 2013/10/15 15:54:42

介绍

如果你开发调试过基于HTC手机的安卓应用,那么你可能遇到过一下几种情况。当你尝试通过用USB连接手机和电脑上运行的HTC同步软件来调试程序时,会出现以下信息:

adb server is out of date. killing...
* daemon started successfully *

通常这个消息的出现通常会伴随着3-5秒的等待时间,并且在成功开始调试程序之前,这条消息会出现N多次。或者,有时候我们根本无法成功启动调试,并且在等待10-20秒后退出加载程序。此时会弹出如下消息:

adb server is out of date. killing...
* daemon started successfully *
** daemon still not runningerror: cannot connect to daemon

ADB服务 

首先,了解一下ADB这个东西。ADB 就像调试安卓程序的桥梁。它是一个使安卓环境完成一系列任务工具,比如:列出连接设备、在互连设备间传输文件、维持TCP/IP连接等等。第二种情况,就是直接采用USB连接手机和HTC同步应用来实现设备间通信的情况下出现的。
下面我们分析一下,当我们连接手机,尝试调试它的时候究竟是怎样的一个过程.

  1. HTC 同步软件(尤其是,htcUPCTLoader.exe 持续在后台运行的时候)探测到你已经连接一个设备,并且尝试分配一个TCP/IP端口给该设备。 为了实现上述目标,它会启动它内部文件中的adb.exe 程序,并且通知它开始将消息映射该端口上。 这个adb.exe 将在后台持续运行,来实现为HTC同步工具提供端口映射。

  2. 当你开启安卓SDK调试后,它将会做一系列含有调用它自己的adb.exe 的子任务。比如:列举连接设备,部署你的app应用等等。当上述子任务开启时,如果新的adb.exe 检测到HTC同步软件 正在运行旧的adb.exe 时,它会终止该进程,并运行自己的实例。

  3. 当在后台运行的HTC同步软件,检测到端口映射被中断,并尝试启动它时。之后会发生什么情况?是的,安卓SDK中的adb.exe将会被踢除。如果上述情况发生在SDK中的adb.exe 完成操作之前,那么你将只能得到一条错误信息,外加调试失败。

解决方法 

首先,我们需要找到与安卓SDK冲突的旧的adb.exe 实例。通过打开任务管理器,找到adb.exe ,选择属性。在做此操作之前需要保证:在执行上述操作时,确保已经通过USB连接上了手机。
一个简单的操作方式是:删除或者重命名HTC同步软件启动的adb.exe 当然,这会终止HTC同步软件。另一种方法是:当你调试你的安卓程序时,终止或暂停htcUPCTLoader.exe。这将会阻止它干扰来自安卓SDK中的adb.exe。
最后,你可以做一个简单的存根用来读取注册表中真实的ADB.exe并用命令行来运行 ADB.exe:

#include"stdafx.h"#include<bzscore/Win32/registry.h>usingnamespace 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 = newwchar_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同步软件中的adb.exe重命名为adb_noadbfix.exe,并把该存根替换掉原始文件。 
你可以通过单击这里获得可安装的可视化的存根实例:


赞助商