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_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 Server和adbd daemon。在Android.mk文件中可以看出编译adb server的时候ADB_HOST这个宏为1,而编译adbd_daemon是ADB_HOST为0。

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

a)、init_transport_registration():

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

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

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

3、local_init()

4、install_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_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 shell命令是如何发送到adbd daemon那边的了。下面再来看看adbd daemon是如何处理这些命令的。

ADB模块源码分析(二)——adb server的启动的更多相关文章

  1. 【Canal源码分析】Canal Server的启动和停止过程

    本文主要解析下canal server的启动过程,希望能有所收获. 一.序列图 1.1 启动 1.2 停止 二.源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明. 首先程序 ...

  2. netty源码分析之一:server的启动

    nio server启动的第一步,都是要创建一个serverSocketChannel,我截取一段启动代码,一步步分析: public void afterPropertiesSet() throws ...

  3. ADB 源码分析(一) ——ADB模块简述【转】

    ADB源码分析(一)——ADB模块简述 1.Adb 源码路径(system/core/adb). 2.要想很快的了解一个模块的基本情况,最直接的就是查看该模块的Android.mk文件,下面就来看看a ...

  4. nginx健康检查模块源码分析

    nginx健康检查模块 本文所说的nginx健康检查模块是指nginx_upstream_check_module模块.nginx_upstream_check_module模块是Taobao定制的用 ...

  5. Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend

    本文是Scheduler模块源码分析的第二篇,第一篇Spark Scheduler模块源码分析之DAGScheduler主要分析了DAGScheduler.本文接下来结合Spark-1.6.0的源码继 ...

  6. Spark Scheduler模块源码分析之DAGScheduler

    本文主要结合Spark-1.6.0的源码,对Spark中任务调度模块的执行过程进行分析.Spark Application在遇到Action操作时才会真正的提交任务并进行计算.这时Spark会根据Ac ...

  7. Zepto事件模块源码分析

    Zepto事件模块源码分析 一.保存事件数据的handlers 我们知道js原生api中要移除事件,需要传入绑定时的回调函数.而Zepto则可以不传入回调函数,直接移除对应类型的所有事件.原因就在于Z ...

  8. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  9. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

随机推荐

  1. Java 8 新特新 工具类 ZonedDateTime

    类ZonedDateTime java.lang.Object继承 java.time.ZonedDateTime 所有实现的接口: Serializable,Comparable < Chro ...

  2. C语言链表实现

    #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" typedef s ...

  3. centos 使用windows7 存储

    1. 在Windows7上创建一个带密码的用户,如disk 2. 创建一个文件夹,如 D:\centos-disk2 3. 选中此文件夹,点击上方的  共享 -> 特定用户, 添加disk用户, ...

  4. PLSQL result set exceeds the maximum size(100M)if necessary,you can explicitly confinue this query

    在PL SQL 里执行一条语句,当反正信息达到2w条时,弹出如下内容:result set exceeds the maximum size(100M)if necessary,you can exp ...

  5. uva10288 Coupons 【概率 分数】

    题目: 题意: 一共n种不同的礼券,每次得到每种礼券的概率相同.求期望多少次可以得到所有n种礼券.结果以带分数形式输出.1<= n <=33. 思路: 假设当前已经得到k种,获得新的一种的 ...

  6. interrupt和isInterrupted的基本使用方法

    java线程是协作式,而非抢占式 调用一个线程的interrupt() 方法中断一个线程,并不是强行关闭这个线程,只是跟这个线程打个招呼,将线程的中断标志位置为true,线程是否中断,由线程本身决定. ...

  7. PhpStorm (强大的PHP开发环境)2017.3.2 附注册方法

    最新版PhpStorm 2017正式版改进了PHP 7支持,改进代码完成功能. PhpStorm 是最好的PHP开发工具,使用它进行PHP开发将会让你感觉到编程的乐趣. 快乐无极终于从oschina看 ...

  8. php从数组中取出一段 之 array_slice

    array array_slice ( array $array , int $offset [, int $length [, bool $preserve_keys ]] ) array_slic ...

  9. background image

    http://www.ajaxblender.com/bgstretcher-2-jquery-stretch-background-plugin-updated.html http://blog.d ...

  10. DataStage 六、安装和部署集群环境

    DataStage序列文章 DataStage 一.安装 DataStage 二.InfoSphere Information Server进程的启动和停止 DataStage 三.配置ODBC Da ...