65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2012 年 7 月 10 日

CPOL

3分钟阅读

viewsIcon

163921

downloadIcon

5

本文描述了 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 与手机通信。

现在我们来看看当您连接手机并尝试调试它时会发生什么。

  1. HTC Sync(更具体地说,后台持续运行的 htcUPCTLoader.exe)检测到您已连接设备,并尝试将 TCP/IP 端口转发到该设备。为此,它运行其自身文件夹中的 adb.exe 并告诉它开始映射端口。adb.exe 持续在后台运行,为 HTC Sync 提供端口映射。
  2. 当您使用 Android SDK 开始调试时,它会执行几个小的任务(例如,列出设备、部署您的应用等),每个任务都涉及对其自身 adb.exe 的调用。当发生这种情况时,较新的 adb.exe 会检测到 HTC Sync 的旧 adb.exe 正在运行并终止它,然后运行它自己的实例。
  3. 后台运行的 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,并将存根放在原始文件所在的位置。

© . All rights reserved.