一、adb工具的工作原理图
解释一下这张图
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工具的通信方式原理图(两种)
方式1:TCP连接
方式2:Usb cable
可以看到在PC端也有个USB端口的驱动程序在工作、Android端当然也有驱动程序在工作
三、证实下Mac下的adb通信
1、adb演绎了进程间通信,为啥我的adb进程占用的端口是18??只代表占据,不代表监听(注意监听二字,进程启动后,可以设定监听哪一个端口),截图中是两个adb client进程的信息
2、lsof -iTCP -sTCP:LISTEN 可以查看进程正在监听TCP端口的情况
我们看到了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 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连接断开
六、实验过程中,发现个秘密
Android Studio关闭后,Adb Server进程会被结束掉……看来是为了节约资源……每次Android Studio都会这么做吗?是的,全平台都是这样!!!这个东西是不是整个世界只有我知道!!
七、adb logcat,也看到了adb Client与adb Server建立的TCP连接
lsof -i tcp:5037
pid为54187的adb Clinet,使用的端口是54134,这点注意一下,因为它仅需要随意找一个没人用的端口,然后与adb server建立TCP连接
注意:
adb Client进程与adb Server进程建立了TCP连接
adb Client进程是bash进程 fork出来的,所以adb Client的父进程就是bash进程
八、总结
熟悉adb的工作原理,帮助我们在工作中处理一些棘手的问题
1、adb server工作异常
2、adbd出现问题
3、logcat不好使了
4、牛逼工程师必备技能!