ADB源码分析(一)

ADB是android debug bridge的缩写,负责计算机与Android设备的几乎所有通信和协作,可以认为是连接两者的桥梁。

在Android开发和恶意代码分析中,经常用到它的install、uninstall、push、pull、logcat、shell等命令。它的用法可以参考SDK的文档:

http://developer.android.com/guide/developing/tools/adb.html

正因为其独特的桥梁作用,有必要详细了解其工作过程。幸运的是,我们可以获得其源码,它位于Android源码树的platform/system/core/adb/目录下,可以通过下面的git命令下载:

git clone git://android.git.kernel.org/platform/system/core.git

如果要编译,还是推荐下载完整的Android源码,并参考上一篇文章所述编译方法。

ADB由两个物理文件组成:

  1. adb或adb.exe,运行于PC端,包括Linux、Windows、Mac OS等系统之中,通常是x86架构上(下文中,ADB指整个模块,而adb单独指这一部分);
  2. adbd,运行于Android设备的底层Linux之中,ARMv5架构上。

为了保持两者代码一致,Google并未将其做源码文件级别的分离,而是统一为一份代码,通过传入Android.mk的$(BUILD_SIMULATOR)变量是否为真,来构建不同的文件。对源码而言,由ADB_HOST宏是否预定义为真来区分。

而adb本身还需要估计多个操作系统平台,这由传入Android.mk的$(HOST_OS)来控制,它的有效取值包括linux、darwin、freebsd和windows。不同平台的主要差异是USB的控制方法和文件路径。

除了物理文件上的区别,adb本身还会在PC中产生两类不同的进程。

其中一个进程将由命令行“adb fork-server server”产生(给用户的调用接口是adb start-server),这个守护进程长期运行于后台,没有控制台界面,称之为adb server(adb服务端),其主要工作有两部分:

  1. 管理PC中的Android模拟器,以及通过USB线连接到PC的Android设备,负责维持运行于其中的adbd进程与自身的数据通道;
  2. 实现PC与设备/模拟器之间的数据拷贝。

adb的另一类进程是提供给用户的命令行工具,对用户暴露了上述install、push、shell等接口,与用户交互,称之为adb client(adb客户端)。其主要工作是解析这些命令的参数,做必要预处理,然后转移为指令或数据,发送给adb服务端。adb服务端再将指令数据转发到模拟器或设备中,由adbd处理,产生结果,再通过adb服务端接收回来。

事实上,当adb客户端运行时,会自动检查当前系统中是否存在adb服务端,如果不存在,则通过“adb fork-server server”启动一个服务端,然后再与之建立连接。这样,用户就不需要关心这些概念和差异了。

因此,从运行实体上看,ADB由三部分构成:

  1. adbd
  2. adb server
  3. adb client

Google还引入了一个adb service(adb服务,注意与adb服务端的区别)的概念,指adbd提供的功能。这就构成了ADB的四个模块。在源码的OVERVIEW.txt文件中对它们的关系进行了描述。而protocol.txt描述了各模块之间通信协作的协议格式。

One thought on “ADB源码分析(一)

Leave a Reply

Your email address will not be published. Required fields are marked *