一、adb工具的工作原理图

adb 读cpu信息 架构_Android

解释一下这张图

1、中间的虚线表示PC与手机的分隔线,左侧是PC、右侧是手机

2、图示中的Client表示adb client进程、Server表示adb server进程(总得都有个名字,就像QQ、微信一样,只不过这里的名字比较简单粗暴……)

3、Client与Server之间的双箭头表示全双工的TCP连接(Network Socket,我猜测是为了兼容性,而未采用UDS,毕竟windows上没有UDS)

4、后台进程5037,指的是adb server进程监听着5037端口

5、图中右侧的adbd,表示手机中的adbd进程

6、5555-5585,指的是adbd作为守护进程(一直在内存中运行的进程,称为守护进程)监听扫描的几个端口号

二、adb工具的通信方式原理图(两种)

adb 读cpu信息 架构_网络_02

方式1:TCP连接

方式2:Usb cable

可以看到在PC端也有个USB端口的驱动程序在工作、Android端当然也有驱动程序在工作

三、证实下Mac下的adb通信

     1、adb演绎了进程间通信,为啥我的adb进程占用的端口是18??只代表占据,不代表监听(注意监听二字,进程启动后,可以设定监听哪一个端口),截图中是两个adb client进程的信息

adb 读cpu信息 架构_网络_03

     2、lsof -iTCP -sTCP:LISTEN 可以查看进程正在监听TCP端口的情况

adb 读cpu信息 架构_adb 读cpu信息 架构_04

我们看到了5037端口的进程,程序名称叫做adb,它其实就是我们所说的adb server进程,正在监听本地的5037端口,端口的状态为LISTEN

直接查看5037端口的状态:lsof -i tcp:5037

发现adb server进程一直处于5037端口为监听状态,端口状态为LISTEN(标准,代表监听)

lsof -i tcp:5037
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
adb     53903   wp   10u  IPv4 0xc7996c315ab1dd2f      0t0  TCP localhost:5037 (LISTEN)

我们启动一个工具,Android Studio,看下Android Studio与adb server进程建立了几个TCP连接,竟然建立了4个TCP连接!!!

lsof -i tcp:5037

adb 读cpu信息 架构_网络_05

四、adb client进程与adb server进程之间的通信方式

    adb server与adb client之间使用Network Socket作为进程间通信的方式,根据标准,也称为SOCK_STREAM,表示为TCP的Socket

备注:Socket通信的两种方式

1、本机通信:Network Socket或Unix Domain Socket

2、跨网络通信:Network Socket
 

五、adb client与adb server的TCP连接的断开

    通过adb Client进程发出命令的时候,会先与adb Server进程建立TCP连接, 然后发出消息,接着因为adb Client进程的结束,会主动发起与adb server进程的TCP连接断开

adb 读cpu信息 架构_adb 读cpu信息 架构_06

六、实验过程中,发现个秘密

    Android Studio关闭后,Adb Server进程会被结束掉……看来是为了节约资源……每次Android Studio都会这么做吗?是的,全平台都是这样!!!这个东西是不是整个世界只有我知道!!

七、adb logcat,也看到了adb Client与adb Server建立的TCP连接

lsof -i tcp:5037

adb 读cpu信息 架构_网络_07

pid为54187的adb Clinet,使用的端口是54134,这点注意一下,因为它仅需要随意找一个没人用的端口,然后与adb server建立TCP连接

注意:

adb Client进程与adb Server进程建立了TCP连接

adb Client进程是bash进程 fork出来的,所以adb Client的父进程就是bash进程

adb 读cpu信息 架构_Server_08

八、总结

熟悉adb的工作原理,帮助我们在工作中处理一些棘手的问题

1、adb server工作异常

2、adbd出现问题

3、logcat不好使了

4、牛逼工程师必备技能!