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

来源:互联网 发布:ipad淘宝发布宝贝 编辑:程序博客网 时间:2024/04/27 23:15

转自 http://www.apkbus.com/blog-50331-54621.html


1、 ADB Server的启动

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

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

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

 

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

      

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

       

       

       

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

       

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

      

    在adb_main中通过ADB_HOST这个宏来控制ADB Serveradbd daemonAndroid.mk文件中可以看出编译adb server的时候ADB_HOST这个宏为1,而编译adbd_daemonADB_HOST0

       

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

    a)init_transport_registration():

        

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

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

        

        

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

         

        

3local_init()

        

4install_listener()

        

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

        

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

 

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

       

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

       

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

       

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

       

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

 

     先来看看ss_listener_event_func

               

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

        

        

下面来看一下transport_sockets_events()

        

        

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

启动adb server的时候创建了两个线程,input_threadoutput_threadinput_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_writeADB Server端的命令发送到adbd daemon的。

        

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 耳机线外皮破了怎么办 耳机罩掉皮了怎么办 耳机皮掉了怎么办 债券逆回购买入怎么办 京东保价 发票怎么办 win7用户已锁定怎么办 电脑账户被锁定怎么办 win7状态不可用怎么办 电脑的本地连接不见了怎么办 win7电脑没有本地连接怎么办 win7字体换不了怎么办 电脑没系统了怎么办 电脑系统没有了怎么办 系统调用区域小怎么办 win8.1网络受限怎么办 电脑连wifi受限怎么办 鼠标不好用了怎么办 手机指纹不好使怎么办 手机录像不好使怎么办 手机1个卡不好使怎么办 手机收藏不好使怎么办 window10连不上网怎么办 电脑没有家庭组怎么办 usb共享网络出错怎么办 电脑共享有密码怎么办 win10连不上网怎么办 w10网络重置了怎么办 点击网络重置后怎么办? 电脑启动找不到硬盘怎么办 电脑开机找不到硬盘怎么办 电脑找不到宽带连接怎么办 电脑文件找不到了怎么办 电脑找不到手机热点怎么办 win7电脑没有网络适配器怎么办 手机计算机桌面找不到怎么办 手机忘记开锁密码怎么办 电脑没网感叹号怎么办 本地连接2没有了怎么办 电脑上找不到本地连接怎么办 网络无访问权限怎么办 电脑无网络访问怎么办