
安卓
做过
安卓开发的朋友或多或少都遇到过让人厌恶的类似于“could not read ok from ADB Server”的错误。产生这个错误的原因可能多种多样,每次遇到问题的时候,可能大部分人都和我一样,去
Google一下这个问题别人是如何解决的。假设一下子找到解决了,就放过,下次在遇到的时候同样的再去
Google一下就好了。但是,这样不是正确的治学态度,为此孔祥子决定去扒一扒! 如下,是我在发现
Android studio连接不上
手机的时候,尝试去启动一个adb server,但是失败了。 pre 根据问题提示,5037端口被占用了。下面就来看看到底是哪一个端口被占用。 pre C:\Users\zxynetstat -ano | findstr 5037 TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 7912 TCP 127.0.0.1:5037 127.0.0.1:50025 ESTABLISHED 7912 TCP 127.0.0.1:5037 127.0.0.1:56501 ESTABLISHED 7912 TCP 127.0.0.1:50025 127.0.0.1:5037 ESTABLISHED 7120 TCP 127.0.0.1:56501 127.0.0.1:5037 ESTABLISHED 1264 /pre 果然,5037被进程id为7912的进程占用了。顺藤摸瓜,看看到底什么进程捣的鬼, pre C:\Users\zxytasklist | findstr 7912 romaster_daemon.exe 7912 Console 1 3,024 K /pre 看到了吗,是这个进程romaster_daemon.exe ,好了,到此为止找出来是哪一个程序了,下面打开任务管理器,kill掉就可以了。
Android adb(
Android Debug Bridge) 是一个通用命令行工具,其允许您与模拟器实例或连接的
Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。 该工具作为一个
客户端-
服务器程序,包括三个组件:
客户端(adb client) ,该组件发送命令。
客户端在开发
计算机上运行。可以通过发出 adb 命令从命令行终端调用
客户端。 这里说的
客户端,其实包含很广泛。例如我们在命令行窗口运行一个adb命令,其实就是一个adb
客户端。还有,我们在
Android studio中通过点击运行或者调试按钮,app就安装到
手机里面了,这个也可以看做是adb
客户端。对应的后台进程名称 根据运行的程序的不同而不同。 后台程序 ,该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。 也就说,开发者测试
手机或者模拟器上运行的后台进程,负责接收命令,并运行命令。这个名字对应应该是adbd 具体如下 服务端 ,该组件管理
客户端和后台程序之间的通信。
服务器在开发
计算机上作为后台进程运行。 您可以在
Android_sdk/platform-tools/ 中找到 adb 工具 这个是在开发者自己的
电脑上,运行的旨在管理adb
客户端和
手机端的后台程序通信的一个管理程序。 具体流程如下 启动一个 adb
客户端时,此
客户端首先检查是否有已运行的 adb
服务器进程。如果没有,它将启动
服务器进程。当
服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 adb
客户端发送的命令—所有 adb
客户端均使用端口 5037 与 adb
服务器通信。 然后,
服务器设置与所有运行的模拟器/设备实例的连接。它通过扫描 5555 到 5585 之间(模拟器/设备使用的范围)的奇数号端口查找模拟器/设备实例。
服务器一旦发现 adb 后台程序,它将设置与该端口的连接。请注意,每个模拟器/设备实例将获取一对按顺序排列的端口 , 这些端口包括用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如: 模拟器 1,控制台:5554 模拟器 1,adb:5555 模拟器 2,控制台:5556 模拟器 2,adb:5557 以此类推... 如上所示,在端口 5555 与 adb 连接的模拟器实例与侦听端口 5554 的控制台的实例相同。 注意 ,这里所说的端口都是开发者
电脑上的端口。 我的理解,偶数端口用来实际的数据传输。奇数端口用来发送控制命令和连接用的,例如调试。(如果不正确请指出) 当
服务器已设置与所有模拟器实例的连接后,您可以使用 adb 命令访问这些实例。由于
服务器管理与模拟器/设备实例的连接,并处理来自多个 adb
客户端的命令,因此,您可以从任意
客户端(或从某个脚本)控制任意模拟器/设备实例。 解读一下 注意:上图中的标识为黄色的区域的进程为后台守护进程。 Adb Server运行在开发者
电脑上,任何adb client都要等待这个运行起来之后才能做后续的工作。
电脑上的
Android studio或者eclipse等一些adb client和它交互。一旦adb client的命令被发送到
手机中,并且被
手机中的adbd接收之后,才能和
手机交互。 然后在看一张更详细的图 这个图,详细的解释了我运行adb命令中的详细细节。 关于adb的详细命令可以参考:
http://adbshell.com/commands 这个网站详。 看了之后,对于前面的5037被占用,导致无法连接
手机的原因,我想,我们应该有了更深层次的理解。同时对于其他情况的不能连接
手机,我们下次就会有了自己的思考了。