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描述了各模块之间通信协作的协议格式。

http://blog.claudxiao.net/2011/05/adb_analysis_part1/

更多相关文章

  1. 阅读Android消息机制源码的随手笔记
  2. Android(安卓)应用权限管理默认开关的修改方法
  3. android+eclipse+phonegap1.7(cordova)配置项目 .
  4. Dialog与DialogFragment设置大小位置的区别
  5. Android学习笔记10——Android的调试
  6. AndroidManifest.xml 文件里面的内容介绍
  7. Android本地存储和SharedPreferences
  8. Android(安卓)Socket通信
  9. Android(安卓)9.0 sdCard文件读写

随机推荐

  1. 【中文】OCP 071考试题库(cuug整理)第27
  2. Qunar智能多机房链路冗余
  3. 【案例】星环科技原厂数据备份恢复软件,让
  4. 面向对象的相关操作
  5. 【PHP 面向对象】面向对象(OOP)编程之PDO
  6. vue api实例方法 有四个 $watch $emit $f
  7. 0512 作业
  8. PHP:MySQL常用DDL数据定义语言, DML数据
  9. 210429 PHP 回调函数 递归函数 数组函数
  10. 触屏事件-上下左右滑动