ADB源码分析(一)——ADB模块简述

1、Adb 源码路径(system/core/adb)。

2、要想很快的了解一个模块的基本情况,最直接的就是查看该模块的Android.mk文件,下面就来看看adb模块的Android.mk文件:

……

ifeq ($(HOST_OS),linux) //用HOST_OS这个宏来兼容不同的操作系统的adb可执行程序(windows、Linux……)

USB_SRCS := usb_linux.c

EXTRA_SRCS := get_my_path_linux.c

LOCAL_LDLIBS += -lrt -lncurses -lpthread

endif

……

LOCAL_MODULE := adb  //编译生成adb可执行程序。运行于PC端,通过HOST_OS这个宏来兼容不同的操作系统

……

include $(BUILD_HOST_EXECUTABLE)

……

……

LOCAL_MODULE := adbd //运行在手机端或模拟器等终端设备的adbd daemon进程

LOCAL_FORCE_STATIC_EXECUTABLE := true

LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN)

LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)

LOCAL_STATIC_LIBRARIES := libcutils libc

include $(BUILD_EXECUTABLE)

……

ifneq ($(SDK_ONLY),true)

LOCAL_MODULE := adb //编译sdk时生成一个adb可执行程序sdk/platform-tools/adb

LOCAL_STATIC_LIBRARIES := libzipfile libunz libcutils

include $(BUILD_EXECUTABLE)。

通过查看system/core/adb模块的Android.mk文件,我们队adb有了一个初步的印象: “adb的工作是由两个可执行文件完成的”。

a)、adb/adb.exe:运行于PC端(包括Linux、Windows、MacOS等操作系统之中),通常是x86架构之上。也就是我们常用的Android开发工具

SDK中(platform/tools/adb),我们在命令提示行执行adb命令时,就是通过这个adb程序执行的。

b)、adbd:运行于Android设备的底层Linux之中,ARMv5架构上。构建不同文件,通过传入Android.mk的$(BUILD_SIMULATOR)变量是否为真。

源码中由ADB_HOST宏用来区分本地主机(adb)和目标机(adbd)。区分不同OS,通过传入Android.mk的$(HOST_OS)。它的有效取值包括linux、

darwin、freebsd和windows。不同平台的主要差异是USB的控制方法和文件路径。

3、直接编译该模块,可以看到会生成如下一些内容:

编译生成的也就是我们上面讲到的adb模块的两个可执行文件(adb和adbd daemon)。我们进入adb shell下,在sbin/目录下存在一个adbd可执行程序,这就是就是ADB模块编译生成的这个adbd可执行程序。而我们在安装Android开发环境的时候有指定过sdk的环境变量,因此我们在命令行下面输入的adb命令,就是通过sdk中的adb这个可执行程序进行响应的。 我们通过ps命令可以看到adb和adbd也分别运行于PC端和Adb设备中,也就是说我们执行的所有的adb命令都是通过adb进程与adbd 守护进程之间进行数据交换的结果。

4、 通过上面的介绍,相信我们对ADB模块已经有了一个初步的印象了,要想更进一步了解adb模块,就需要深入的去分析一些整个adb模块的实现的方式了。在分析整个模块代码之前,我们先看一下Google对整个ADB模块的介绍(在system/core/adb目录下有一个OVERVIEW.txt文件),这个文件介绍了这个adb模块的工作过程。英文好的同学可以详细的阅读一下OVERVIEW.txt这个文件,这个文件对整个ADB模块的工作原理讲的比较透彻。

简单的看看这个文件的描述,整个ADB模块由如下几个模块组成:

a)、The ADB server(adb): 运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除。ADB Server是一个时刻协调交换Client、Services和Android devices之间的数据。

b)、The ADB daemon (adbd) : 运行于一个Android Devices/Emulator的后台守护进程,该进程主要是用来连接ADB Server通过USB(模拟器通过TCP协议)为adb clients提供一些运行于PC端的services。

c)、The ADB command-line client: 执行adb 命令的终端,它会找出PC端的运行的adb server如果没有找到就会自动的启动adb server,然后向adb server发送请求命令。

d)、Services: 由此服务给adbd提供功能,即由这个模块完成,主要分为Host Services及 Local Services两类

Host Services: 运行于ADB Server,不需要和devices进行数据交换。典型的就是执行adb devices命令时,只需要adb server端返回当前的adb devices的状态即可。

Local Services: 运行于adbd守护进程,ADB Server 在adb clients和Local Services之间复用Streams。Local Services 用来初始化传递数据的连接。

ADB 通讯模型图(欲了解更详细的情况可以查看system/core/adb/transports.txt文件中的介绍)

(adb 通讯模型图)

5、要想进一步了解adb命令的工作方式,就需要我们进一步研究adb模块的源码。Adb运行的入口在system/core/adb/adb.c中,下面来初步看看adb.c的main()方法:

int main(int argc, char **argv)

{

#if ADB_HOST //前面讲到在Android.mk中定义了这个宏,如果编译adb ADB_HOST = 1否则ADB_HOST = 0

adb_sysdeps_init();

adb_trace_init();

D("Handling commandline()\n");

return adb_commandline(argc - 1, argv + 1); //运行PC端的adb/adb.exe可执行程序

#else

/* If adbd runs inside the emulator this will enable adb tracing via

* adb-debug qemud service in the emulator. */

adb_qemu_trace_init();

if((argc > 1) && (!strcmp(argv[1],"recovery"))) {

adb_device_banner = "recovery";

recovery_mode = 1;

}

start_device_log();

D("Handling main()\n");

return adb_main(0, DEFAULT_ADB_PORT); //运行Android devices/emulator 的adbd可执行程序

#endif

}。

小结:本篇文档主要讲解了以下内容:

1、adb模块的源码路径,源码编译生成的结果。

2、adb模块分为adb client、adb server、services、adbd daemon几个模块。

3、adb通讯模型。

4、adb与 adbd daemon的入口函数

ADB 源码分析(一) ——ADB模块简述【转】的更多相关文章

  1. 【转】Spark源码分析之-deploy模块

    原文地址:http://jerryshao.me/architecture/2013/04/30/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...

  2. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  3. elasticsearch源码分析之search模块(server端)

    elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...

  4. elasticsearch源码分析之search模块(client端)

    elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们 ...

  5. (一) Mybatis源码分析-解析器模块

    Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...

  6. Spark RPC框架源码分析(一)简述

    Spark RPC系列: Spark RPC框架源码分析(一)运行时序 Spark RPC框架源码分析(二)运行时序 Spark RPC框架源码分析(三)运行时序 一. Spark rpc框架概述 S ...

  7. 【转】Spark源码分析之-scheduler模块

    原文地址:http://jerryshao.me/architecture/2013/04/21/Spark%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B- ...

  8. Spark源码分析之-Storage模块

    原文链接:http://jerryshao.me/architecture/2013/10/08/spark-storage-module-analysis/ Background 前段时间琐事颇多, ...

  9. jQuery 源码分析(十一) 队列模块 Queue详解

    队列是常用的数据结构之一,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).特点是先进先出,最先插入的元素最先被删除. 在jQuery内部,队列模块为动画模块提供基 ...

随机推荐

  1. Spring cloud 分布式锁

    https://github.com/easonstudy/springboot_demo study目录中

  2. js动态加载数据到文本框指定的位置

    html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  3. JAVA 非对称加密工具

    import java.io.File; import java.io.FileInputStream; import java.math.BigInteger; import java.securi ...

  4. 【python 】装饰器 (多个参数的函数,带参数的装饰器)【转】

    最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...

  5. win7局域网内共享文件夹及安全设置

    右键想要共享的文件夹,选择属性. 在文件夹属性对话框中选择共享标签,如图: 点击共享按钮,弹出文件共享对话框. 添加 Everyone ,并根据实际需要修改权限.权限可以是读取 或 读取/写入. 到此 ...

  6. 2017面向对象程序设计(Java)第十一周学习总结

    首先,由于前几周同学们普遍反映知识点比较难,并且累积较多,难以掌握,所以老师在上周对教学方案进行了如下调整: (1)周四下午理论课第一学时,将结合实验八与实验九的编程题,通过范例演示同学们存在问题的解 ...

  7. Error while trying to retrieve text for error ORA-12154

    问题描述:vs中调试运行没有任何错误,但是发布到IIS中访问,就会报以上错误.IIS不会调试,所以一头雾水,不止错误在哪里. 分析:看到网上有人分析了Web.config模拟验证的问题恍然大悟: 原文 ...

  8. sublime相关资源

    Sublime Text 全程指南 http://zh.lucida.me/blog/sublime-text-complete-guide/ Sublime官网Package安装 https://p ...

  9. 健康类App原型制作分享-Mindmate

    Mindmate是一款健康类App,主要是帮助人们快速入眠,放松情绪,它拥有小清新的界面,配图全是由插画组成,生动有趣.在这款原型中,为了保持App的原有特色,将插画通过图片组件导入进来:音乐播放界面 ...

  10. ST-LINK驱动的安装

    1.下载ST-LINK驱动ST-LINK_USB_V2_1_Driver 双击dpinst_amd64.exe来安装. 成功会显示: 2.进入MDK5里面去配置ST-LINK 通过魔术棒选项: a.D ...