Client、Server和Daemon
PC端有一个ADB.exe,它既是Client,也是Server,而Daemon则是存在于手机端,Daemon需要在开发者模式中手动开启。
Client为我们使用ADB功能提供API,我们通过Client来执行ADB操作,但它只是请求的发起者而非执行者,具体执行请求是在Server和Daemon中完成。Server在后台运行,它的作用是作为沟通Client与Daemon的桥梁,由于Client与Daemon并未直接建立连接,Client与Daemon的交互由Server代为进行,Server也可以将Client指定的Daemon交给Client直接操作。
Service
ADB的具体功能即Service分两种:Host Service和Local Service。Host Service由Server完成,例如adb devices命令就是Client向Server发起的请求,Server来查询连接到Server的Daemon数量和信息后返回给Client。Local Service由Daemon完成,例如adb shell。
启动流程
使用adb start-server会在PC端启动ADB server并监听5037端口等待Client连接。此外,执行或等部分命令会默认向localhost:5037进行请求,如果连接超时则会自动在5037端口启动Server。另外,在启动Server以及使用Client时,我们可以指定IP和Port,实现远程请求。
首先在一台机器上以1234端口启动ADB Server
然后在另一台机器上用Client指定ip和端口进行连接
Server启动后Client可以通过TCP向Server发起请求,格式如下
比如查询adb的版本号,我们首先使用启动Server,然后使用socket连接,再使用socket发送,随后Server会返回或者,如果为则会继续返回具体的版本信息。其中即为头部,即为Payload,代表Payload的长度为12。其中Payload的前缀代表将执行Host Service中的操作。对于Local Service在下文中会提到。在接收到消息以后,Client和Server的连接不会断开,可以复用该连接继续进行请求,但是某些特定的命令会在接收到后改变连接的状态,比如会将连接转移到指定设备的Daemon中,来直接与其进行通信。
misc
不难想象会存在Client和Server版本不匹配的情况,adb默认的操作是将server关闭并从adb.exe启动自己版本的server