adb即 Android Debug Bridge 是一个通用的命令行工具,可用于经过PC端对链接的Android模拟器设备或链接至电脑的真实物理设备进行命令行操做。目前,许多软件均会借助 adb 工具与移动终端进行交互。这里以 Android Studio 中带有的 adb 工具为例,描述与启动 adb shell相关的步骤,从而解释出现上述错误的缘由。html
Android Studio 自带的 adb 位于C:\Users\user_name\AppData\Local\Android\Sdk\platform-tools文件夹下(即实际位置取决于Sdk的安装目录)。android
命令行运行adb工具shell
安装 Android Studio 后,命令行中输入 adb 命令(如adb -version,显示adb的版本号)时,系统会提示找不到该命令。这是因为 adb 工具的位置没法被肯定,可经过如下几种方案在命令行方式下运行 adb :服务器
(1)将 adb 工具所在目录的路径加入系统的 Path 环境变量中,则可在命令行的任意路径下直接运行 adb 命令。在这里,也就是将 C:\Users\user_name\AppData\Local\Android\Sdk\platform-tools 加入 Path 变量中;网络
(2)切换控制台中的路径至 adb 工具所在路径下,如能够经过命令 cd C:\Users\user_name\AppData\Local\Android\Sdk\platform-tools切换至 adb 工具所在的文件夹,便可在当前命令行中直接运行 adb 命令;工具
(3)在文件管理器中,进入上述 C:\Users\user_name\AppData\Local\Android\Sdk\platform-tools 目录,在该目录内,按住 Shift 键,右键 -> 在此处打开命令窗口 ,在打开的窗口中能够看到控制台提供的路径名称与(1)中切换后的效果是一致的;this
没法运行 adb shell 命令url
在完成上述操做后,运行 adb shell 命令,出现报错信息:adb server version (26) doesn't match this client (39); killing...spa
根据查到的资料的一些说法,这一问题是因为系统上存在两个不同版本的 adb 工具形成的。.net
笔者在上述目录下(属于Android Studio的目录)运行了命令 adb version,结果以下图:
也就是说当前目录下,Android Studio自带的adb工具版本为 1.0.39 ,猜测这就是上述报错信息中的 client(39),相应的可能系统上还存在一个版本为26的 adb 工具。
问题描述
笔者查阅了Android Studio官网上对 adb 工具的介绍。介绍中对 adb 的描述: 启动一个adb 客户端时,此客户端首先检查是否有已经运行的 adb 服务器进程。若是没有,它将启动服务器进程。当服务器启动后,它将与本地 TCP 端口 5037 绑定,并侦遵从 adb 客户端发送的命令。全部的 adb 客户端均经过端口 5037 与 adb 服务器进行通讯。
经过上述描述,能够看到既然报错信息显示的是adb server version(26),那当前系统中必定存在一个 adb 服务进程 , 它较之咱们运行的那个 adb 工具先开始,且版本要低于咱们使用的 adb 版本。能够经过命令行工具查找该进程。
(1)因为 adb 服务进程必定会占据 5037 端口,因此首先查看当前 5037 端口被那个进程调用。命令行方式下能够经过 netstat 命令显示当前的网络状况,可经过 netstat /? 查看命令帮助。
netstat -ano | findstr "5037" //在 netstat 输出的结果中筛选出有 5037 字符串的行,findstr命令相似于Linux下的grep
结果以下图所示:
(2)得到上述进程 pid 对应的进程的信息。有两种方式,经过命令行或者任务管理器。
a)打开 任务管理器 -> 详细信息 ,经过 pid 便可定位对应的进程,可经过右键 -> 属性,可查看该进程的描述信息,从而得到另外一个 adb 工具相关的信息;
b)经过命令行工具,tasklist | findstr "10044"找到对应的进程;
tasklist | findstr "xxx" //将tasklist输出结果中带有目标字符串的行筛选出来
其中,经过任务管理器得到的信息更详细,能够定位到对应的 adb 工具的目录位置。好比 360 的软件中,会带有 adb 工具,而这可能会带来 adb 工具版本的不一样。
解决方案
解决的方法包括但不限于将以前启动的adb服务进程删除掉(注意要肯定对应的应用程序能够关闭该服务),以后再启动咱们想要的 adb 工具。
在终止了以前存在的不一样版本的 adb 服务进程以后,再次启动 Android Studio 对应的 adb 工具时, 该 adb 工具会发现当前没有 adb 服务端,故而会自行启动服务器进程,以下图。因为没有链接设备,故而不会直接显示出Shell。
经过命令行工具咱们能够看到系统上如今存在了新的 adb 服务器进程,是由咱们刚才使用 adb 工具的命令开启的。
完成上述操做后,便可以将物理设备的USB调试模式打开,并链接至PC,再次使用 adb shell 命令,便可进入 adb 工具提供的Shell。
其余
基于错误信息的描述,可能的解决方法还包括将两个不一样版本的 adb 工具更新成一致版本,这样能够避免每次使用时均要检查是否已有不一样版本的 adb 服务器进程存在。出现有两个版本的 adb 工具的常见场景是系统可能同时安装了两个提供该工具的应用,如 Android Studio 和 Genymotion ,能够参见 stackoverflow 的回答 。
根据 adb 工具运行的原理,若TCP端口 5037 被其余进程占用了,则也会出现报错,典型的报错信息是 "cannot bind to 127.0.0.1:5037 :t一般每一个套接字地址(协议/网络地址/端口)只容许使用一次",此时可能须要考虑将占用该端口的进程终止掉(在没有反作用的状况下)。