取之于网,用之于网。本为过路人,姑且搬运中。
一、名释
Android: 嵌入式操作系统。截止发文,手机市场占有率第一的操作系统。基于Linux核。
ADB:Android Debug Bridge。用于快速便捷获取系统信息和控制系统。
AOSP: Android Open-Source Project。安卓操作系统源码。
二、主题
关于常规Android debug的通信方式(ADB)的流程浅析。
三、前奏
模块共有 3 大块。
x. adb client:客户端。提供命令集的输入窗口。
y. adb server:服务端。与deamon保持连接并响应客户端指令并与daemon通信获取指令对应的执行结果。
z. adb daemon:守护端。处理指令、交由系统对应部门执行并返回给server结果。也就是常说的adbd进程。
通信方式共有 2 种。
x. usb:通过usb与嵌入式设备连接后通信。
y. socket:通过socket与系统通信。
源码路径:AOSP:/system/core/adb/
默认端口有 2 类。
x. client与server通过5037/5038端口连接交流。
y. daemon的socket方式默认5555/5554端口。
宿主有 2 类。
x. PC上运行着client和server。
y. 嵌入式设备上运行着daemon。
命令流转有 3 种。
x. 在client端就可以直接返回结果。比如adb version 和adb help等。
y. 在server端就可以直接获得结果。比如adb devices。
z. 一定要经过daemon才可能获得结果。绝大多数命令就是这样。
四、HIGH
DAO图走一波!(个人非常不喜欢做图,只有借用他人好图)
图片来源 :https://blog.csdn.net/XING1716263268/article/details/8998192?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
图一非常简洁明了,说明了三者关系。
图二描述了PC端的流程。
图三描述server启动流程
图四描述了daemon的启动。
code: aosp/system/core/adb/daemon/
主入口就在main.cpp中的main函数。
然后调用adbd_main(DEFAULT_ADB_PORT)实体。
在adbd_main中判断access(USB_FFS_ADB_EP0, F_OK)来确定是否要监听usb。
如果上述返回为0则监听usb,并开始执行usb_init(),usb init不在此处展开。
usb_init完后,adbd会检查service.adb.tcp.port是否有设置端口。如果有,则setup_port(port)此端口,也就转换为socket方式通信,local_init(port)。
图五描述了server中local_init的初始化过程。扫描5555-5585,找到设备也可能是模拟器并连接。
图六描述了daemon中local_init的初始化过程。也是标准的socket绑定监听的过程。无需多述。
图七描述了linux pc下的usb通信初始化。另外两个主流的操作系统windows和darwin与上述逻辑基本一致,只是接口等和API方式的差别。
图八描述的daemon中的流程。
五、收
如不尽兴,还请移步如下好文。
https://blog.csdn.net/Clovelegent/article/details/52515889?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task