-
-
[原创]adb学习笔记1——adb流程简介
-
发表于:
2014-6-10 01:00
16327
-
好吧,小弟最近被逼无奈痛苦的读了一下adb的源码,之前在网上看到adb的一些分析,很有启发,但总感觉有些意犹未尽,很多想不通的地方没有查到资料,只能自己啃代码了。。。。虽然过程很痛苦,不过最终还是学到了很多好的思想,由于本人较懒,如果不发点东西,草草的做些笔记觉得有些可惜,所以决定还是来论坛发帖吧,希望可以对同样被逼无奈的小伙伴有些启发,然后 其中的不足与错误之处还请各位大神多多指教,小弟拜谢~
ADB的代码位于目录的system/core/adb下,在ADB代码中经常可以看到一个宏ADB_HOST, 如果定义了 ADB_HOST则表示此段流程是在PC端执行的adb的代码,未定义ADB_HOST的表示此段流程是在手机上的adbd中执行的,在adb编译的时候根据Android.mk的选项,一份代码会编译出两个adb,一个adbd。(话说adb的Android.mk文件中指出最终会编译出三个可执行程序,一个位于pc端的adb,一个位于手机端的adbd,还有一个位于手机端的adb,这个我还没弄清楚干什么用的)。
Adb的基本组成:
Adb由pc端的adb server,pc端的adb client,和手机端的adbd守护进程组成。Pc端的adb client和adb server其实是同一个程序,就是adb.exe,如果adb.exe是作为client启动的(如运行命令adb devices),则此时其会检测其adb server进程是否启动,如果没有启动会启动adb server。
Adb Client:Adb server在pc端开启了之后一般不会结束的,每执行一个adb命令(这里指除了专门针对server的命令,如adb shell, adb install等等)就相当于启动了一个adb client,此adb client 会连接到adb server,然后通过adb server查询命令,如果需要与手机交互,则adb server会负责交互,最终将结果返回给adb client。
Adb是在pc端运行的,pc端的adb client, adb server都是这个adb程序。
Adb server: adb server负责与手机的通信(通过tcp/ip或usb),同时负责监听pc端口,等待adb client的连接(默认端口5037)。
Adbd:adbd作为守护进程运行在手机上,其作用是连接到adb server,并未pc上的adb client提供一些服务
Adb的基本逻辑:
我们从adb的main函数开始看起(adb.c),此函数的大致流程如下
[ ATTACH ] 6WVK0`3AJ0JPKEHF)E4(8E1.jpg [ /ATTACH ]
由于adb_host宏的控制,adb启动的流程为 main()->adb_commandline()->adb_main()/launch_server()
Adbd启动的流程为main()->adb_main()。
总而言之,不管是手机还是pc端,只要是server,最终进入的就是adb_main,这个函数是启服务用的,client进入的是adb_commandline(),这个函数是处理参数和请求用的。
下面先从adb server的流程说起, adb server大体流程如下
[ATTACH] 1.jpg [/ATTACH]
下面调一些主要的说下
1. init_transport_registration():初始化一个socketpair,用来在adb server进程内部传递数据
2. Usb_init():在pc端启动一个线程循环扫描usb设备
3. Install_listener():在pc端启动线程监听本地端口,等待adb client连接
4. Fdevent_loop():进入消息循环,由于adb采用的是异步通信,所有的监听事件都是在这个循环中处理的,其中:
1) fdevent_process():等待或查询,不管怎么地,保证消息队列中至少有一个消息此函数才返回。
2) fdvent_plist_dequeue():从消息队列中获取一个消息
3) fde:这里先暂且理解为记录消息处理函数的结构体,如果此结构体存在,则调用其中的消息回调函数fde->func(),在后面会对此处有详细的介绍。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!