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//运行在手机端或模拟器等终端设备的adbddaemon进程

LOCAL_FORCE_STATIC_EXECUTABLE:=true

LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT_SBIN)

LOCAL_UNSTRIPPED_PATH:=$(TARGET_ROOT_OUT_SBIN_UNSTRIPPED)

LOCAL_STATIC_LIBRARIES:=libcutilslibc

include$(BUILD_EXECUTABLE)

……

ifneq($(SDK_ONLY),true)

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

LOCAL_STATIC_LIBRARIES:=libzipfilelibunzlibcutils

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、直接编译该模块,可以看到会生成如下一些内容:

113051rv7z4l4rwmp4zwam.png

113051hy3f3bto6yzp6zfa.png

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

113048kgi6366qrq66ny8h.png

113049adgf8qj5ieppllk6.png

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

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

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

b)、TheADBdaemon(adbd):运行于一个AndroidDevices/Emulator的后台守护进程,该进程主要是用来连接ADBServer通过USB(模拟器通过TCP协议)为adbclients提供一些运行于PC端的services。

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

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

HostServices:运行于ADBServer,不需要和devices进行数据交换。典型的就是执行adbdevices命令时,只需要adbserver端返回当前的adbdevices的状态即可。

LocalServices:运行于adbd守护进程,ADBServer在adbclients和LocalServices之间复用Streams。LocalServices用来初始化传递数据的连接。

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

113050g332h04g7mm5y0q0.png

(adb通讯模型图)

113049gegza84ue8q8oz88.png

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

intmain(intargc,char**argv)

{

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

adb_sysdeps_init();

adb_trace_init();

D("Handlingcommandline()\n");

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

#else

/*Ifadbdrunsinsidetheemulatorthiswillenableadbtracingvia

*adb-debugqemudserviceintheemulator.*/

adb_qemu_trace_init();

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

adb_device_banner="recovery";

recovery_mode=1;

}

start_device_log();

D("Handlingmain()\n");

returnadb_main(0,DEFAULT_ADB_PORT);//运行Androiddevices/emulator的adbd可执行程序

#endif

}。

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

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

2、adb模块分为adbclient、adbserver、services、adbddaemon几个模块。

3、adb通讯模型。

4、adb与adbddaemon的入口函数

你可能感兴趣的:(ADB源码分析)