首页
社区
课程
招聘
[原创]adb学习笔记1——adb流程简介
2014-6-10 01:00 15472

[原创]adb学习笔记1——adb流程简介

2014-6-10 01:00
15472
好吧,小弟最近被逼无奈痛苦的读了一下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(),在后面会对此处有详细的介绍。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (7)
雪    币: 4759
活跃值: (3334)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
ashimida 5 2014-6-10 01:01
2
0
btw:这个图片神马状况。。。没弄明白。。求救啊。。。
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mingxuan三千 2014-6-10 08:53
3
0
如果监控通过adb 与手机端的所有交互数据,有什么思路没?
雪    币: 4759
活跃值: (3334)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
ashimida 5 2014-6-10 09:32
4
0
可以通过监控server端的回调smart_socket_enqueue来监听所有adb client发给adb server的数据
雪    币: 265
活跃值: (211)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
冰琥珀 2 2014-6-10 09:42
5
0
弱弱的问一句,你有调试过adb源码?
雪    币: 4759
活跃值: (3334)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
ashimida 5 2014-6-10 10:07
6
0
用打log的方式测试算不。。。。。
雪    币: 265
活跃值: (211)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
冰琥珀 2 2014-6-10 10:11
7
0
论坛里有vs下能调试的源码,建议你去下载然后用vs调试下
雪    币: 336
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_higyywgo 2023-3-17 17:35
8
0
牛啊
游客
登录 | 注册 方可回帖
返回