ADB源码分析(一)——ADB模块简述linux
一、Adb 源码路径(system/core/adb)。shell
二、要想很快的了解一个模块的基本状况,最直接的就是查看该模块的Android.mk文件,下面就来看看adb模块的Android.mk文件:windows
……架构
ifeq ($(HOST_OS),linux) //用HOST_OS这个宏来兼容不一样的操做系统的adb可执行程序(windows、Linux……)ide
USB_SRCS := usb_linux.c函数
EXTRA_SRCS := get_my_path_linux.c工具
LOCAL_LDLIBS += -lrt -lncurses -lpthread源码分析
endif开发工具
……this
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的控制方法和文件路径。
三、直接编译该模块,能够看到会生成以下一些内容:
编译生成的也就是咱们上面讲到的adb模块的两个可执行文件(adb和adbd daemon)。咱们进入adb shell下,在sbin/目录下存在一个adbd可执行程序,这就是就是ADB模块编译生成的这个adbd可执行程序。而咱们在安装Android开发环境的时候有指定过sdk的环境变量,所以咱们在命令行下面输入的adb命令,就是经过sdk中的adb这个可执行程序进行响应的。 咱们经过ps命令能够看到adb和adbd也分别运行于PC端和Adb设备中,也就是说咱们执行的全部的adb命令都是经过adb进程与adbd 守护进程之间进行数据交换的结果。
四、 经过上面的介绍,相信咱们对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 通信模型图)
五、要想进一步了解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
}。
小结:本篇文档主要讲解了如下内容:
一、adb模块的源码路径,源码编译生成的结果。
二、adb模块分为adb client、adb server、services、adbd daemon几个模块。
三、adb通信模型。
四、adb与 adbd daemon的入口函数