ADB源码分析(二)——adb sever的启动

ADB源码分析(二)——adb sever的启动

1、 ADB Server的启动

前面我们讲到adb模块的源码在system/core/adb下面,通过查看Android.mk文件我们了解到这个adb

模块回编译生成连个可执行文件adb、adbd,源码通过ADB_HOST这个宏来控制编译的是adb还是adbd。首先我们来看看这个运行于PC端的adb——ADB Server。

下面我们就来看看ADB Server的启动adb.c(system/core/adb/):

ADB模块源码分析(二)——adb server的启动_android adb


接着来看看adb_commandline()(system/core/adb/commandline.c)的实现,它用来接收adb client输入的adb命令。(在OVERVIEW.txt中有如下一段描述:是说adb server是通过adb client来启动的。) 

ADB模块源码分析(二)——adb server的启动_android adb_02

下面就以adb shell命令为例来看看adb client是如何来启动adb server的。

ADB模块源码分析(二)——adb server的启动_android adb_03

ADB模块源码分析(二)——adb server的启动_android adb_04

ADB模块源码分析(二)——adb server的启动_android adb_05

此时由于ADB Server还没有启动,因此socket_loopback_client的返回值为-1,_adb_connect()的返回值就为-2。下面就能看到adb client是如何启动ADB Server的了。

ADB模块源码分析(二)——adb server的启动_android adb_06

至此,我们需要再重新查看adb_commandline()方法了,此时我们执行的是adb fork-server server命令,因此is_server = 1, is_daemon = 1。

ADB模块源码分析(二)——adb server的启动_android adb_07

   在adb_main中通过ADB_HOST这个宏来控制ADB Server和adbd daemon。在Android.mk文件中可以看出编译adb server的时候ADB_HOST这个宏为1,而编译adbd_daemon是ADB_HOST为0。

ADB模块源码分析(二)——adb server的启动_android adb_08

   接下来我们来依次看看ADB Server启动时都做了哪些事情?

   a)、init_transport_registration():

ADB模块源码分析(二)——adb server的启动_android adb_09

上面讲到transport_registration_func这个回调函数会在transport_registration_send这个Socket执行写操作时,会被调用,那什么时候会执行写操作呢?后面再来解答这个问题。

   b)、下面再来看看usb_init(),初始化usb设备监听。

ADB模块源码分析(二)——adb server的启动_android adb_10

ADB模块源码分析(二)——adb server的启动_android adb_11

此处我们就解答了上面的疑惑transport_register_func()什么时候会被调用。再来看看transport_register_func()又做了些什么呢?

ADB模块源码分析(二)——adb server的启动_android adb_12

ADB模块源码分析(二)——adb server的启动_android adb_13

3、local_init()

ADB模块源码分析(二)——adb server的启动_android adb_14

4、install_listener()

ADB模块源码分析(二)——adb server的启动_android adb_15

5、fdevent_loop();//通过IO多路选择机制来选择出要执行的fdevent,并执行它的毁掉函数。

ADB模块源码分析(二)——adb server的启动_android adb_16

上面我们详细的讲解了ADB Server的启动过程,那么ADB Server启动后又是如何与adb client以及adbd daemon进行通信的呢?下面我们在来看看。


    下面我们继续来以adb shell为例来分析:

ADB模块源码分析(二)——adb server的启动_android adb_17

此时fd = socket_loopback_client(__adb_server_port, SOCK_STREAM); 此时5037端口已经被监听,返回值fd 即5037端口的Socket。

ADB模块源码分析(二)——adb server的启动_android adb_18

此时ADB Server端已经启动,fdevent_install(&l->fde, l->fd, ss_listener_event_func, l);ss_listener_event_func这个回调函数就会执行(后面再来看这个函数做了些什么)。

ADB模块源码分析(二)——adb server的启动_android adb_19

同时在interactive_shell()方法中,还创建了一个线程,用来读取client端输入的命令以及将该命令发送到ADB Server端进行处理。

ADB模块源码分析(二)——adb server的启动_android adb_20

通过上面这个thread就会将终端输入的命令发送到adb server端了。上面还讲到client端会发送一个tmp消息给ADB Server端,然后等待ADB Server端的响应OKAY/FAIL,那么ADB Server端又是如何响应的呢?下面我们在来进一步分析。


    先来看看ss_listener_event_func

ADB模块源码分析(二)——adb server的启动_android adb_21ADB模块源码分析(二)——adb server的启动_android adb_22

至此ADB Server端与adb client端的Socket建立完成了。上面在_adb_connect会向adb server端写一个字符串,此时ADB Server端的local_socket_event_func方法将会被执行。

ADB模块源码分析(二)——adb server的启动_android adb_23

ADB模块源码分析(二)——adb server的启动_android adb_24

下面来看一下transport_sockets_events()

ADB模块源码分析(二)——adb server的启动_android adb_25

ADB模块源码分析(二)——adb server的启动_android adb_26

对于adb shell命令具体是如何操作的不是我们的重点,我们的重点是介绍adb的通信流程,因此在此就不再详细分析。下面再来看看是如何将adb shell命令发送到adbd daemon的。

启动adb server的时候创建了两个线程,input_thread和output_thread,input_thread一直监听5037端口,因此会接收到client端输入的adb shell命令。然后通过 t->write_to_remote(p, t);发送到adbd daemon.

前面在初始化usb的时候(init_usb_transport())

t->read_from_remote = remote_read;

t->write_to_remote = remote_write;

再来看看ADB Server是如何通过remote_write将ADB Server端的命令发送到adbd daemon的。

ADB模块源码分析(二)——adb server的启动_android adb_27

至此,我们已经了解了adb shell命令是如何发送到adbd daemon那边的了。下面再来看看adbd daemon是如何处理这些命令的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值