Android Debug Bridge 技术实现原理

ADB(Android Debug Bridge)技术实现

===============
I、总览
===============

ADB用来做下面两件事:

- 跟踪所有已连接的Android设备或运行在开发者机器上的模拟器实例。

- 为满足客户端的需求实现丰富的控制命令。客户端包括命令行用户或者像DDMS一样的帮助程序,控制命令包括“adb shell”,“adb pull”等等。这些控制命令在ADB中被称作“服务”。

总体来看,ADB中的每项工作通过下列组件的配合完成:

1. ADB服务器

ADB服务器是运行在主机上的一个后台进程。它的作用在于检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止。

ADB服务器维护了一个已连接设备的列表,并且为每一个连接设备分配一个状态值,状态值包括:OFFLINE、BOOTLOADER、RECOVERY、ONLINE。

ADB服务器实际上是一个庞大的多路传输循环,它精妙的协调客户端、服务与设备之间的数据交换(实际上是包交换)。

2. ADB守护进程(adbd)

程序“adbd”作为一个后台进程在Android设备或模拟器系统中运行。它的作用是连接ADB服务器(通过USB连接设备,通过TCP连接模拟器),并且为运行在主机上的客户端提供一些服务。

当 ADB服务器成功的与一个设备上的adbd守护进程建立连接时,ADB服务器认为这个设备是“ONLINE”状态。否则,ADB服务器认为设备是 “OFFLINE”状态,“OFFLINE”表明ADB服务器侦测到一个新的设备或模拟器,但是无法与该设备或模拟器上的adbd守护进程建立连接。

“BOOTLOADER”状态表明设备处于bootloader模式下,“RECOVERY”状态表明设备处于recovery模式下。

3. ADB命令行客户端

命令行程序“adb”用于从shell或脚本中运行adb命令。首先,“adb”程序尝试定位主机上的ADB服务器,如果找不到ADB服务器,“adb”程序自动启动一个ADB服务器。

接下来,客户端向ADB服务器发送服务请求。这里面的细节不需要了解。

通常,一个单一的“adb” 二进制程序文件包含了服务器和客户端的实现。这样,服务器的分发和启动都更加容易。

4. 服务

与客户端交互的服务有两种:

主机服务:
主机服务运行在ADB服务器中,因此它们根本不和设备通讯。一个典型的例子就是“adb devices”,它请求返回当前已知的设备及其状态的列表。

本地服务:
本地服务运行在adbd守护进程中,或者被设备上的adbd守护进程启动。ADB服务器被用于客户端与本地服务之间的多路传输数据流。在这种情况下,本地服务的任务是初始化连接,然后为ADB服务器提供服务响应数据。

===============
II、协议细节
===============

1. 客户端<->服务器 交互协议

下面详细说明ADB客户端和ADB服务器之间交互的协议。ADB服务器监听在TCP:localhost:5037。

客户端用下列格式发送请求:
A. 开头4个字节的十六进制字符串给出请求的长度;
B. 后面紧跟请求内容。

举例来说,为了获得ADB服务器的内部版本号,客户端将做下列工作:
A. 建立tcp:localhost:5037的socket连接;
B. 通过socket发送字符串“000Chost:version”。
前缀“host:”用来指示请求被定位到ADB服务器本身(稍后我们将讨论其他类型的请求)。为了便于调试排错,请求内容的长度按ASCII编码计算。

服务器用下列格式回应客户端请求:
A. 成功:回应4个字节的“OKAY”字符串;
B. 失败:回应4个字节的“FAIL”字符串 + 4个字节的十六进制长度说明 + 指定长度的字符串说明失败原因;
C. “host:version”是一个例外,它的回应是4个字节的十六进制字符串,说明服务器的内部版本号。

注意:回应“OKAY”之后,连接仍然是活动的,这样,客户端可以通过这个连接发送其他的请求。但是在特定的情况下,“OKAY”回应会改变连接的状态。
举 例来说,客户端发出“host:transport:<serialnumber>”请求,“<serialnumber>”被 用来标识一个指定的设备或模拟器;在服务器回应“OKAY”之后,客户端再发起的请求会直接送达至对应的adbd守护进程。

在以后的文章中,SSW会列举当前ADB实现的所有服务。

2. 传输协议

ADB传输协议对ADB服务器与一个设备或模拟器之间的连接进行建模。当前有两种类型的传输协议:

- USB传输协议,用于通过USB与物理设备的连接。

- 本地传输协议,用于通过TCP连接到ADB服务器,运行在主机上的模拟器。

虽然现在还没有实现,但是理论上存在这样的可能:写一个本地传输协议,让它代理ADB服务器与连接到另一台机器的设备之间的连接,以及ADB服务器与运行在另一台机器上的模拟器之间的连接。

每次传输能够在客户端和它们所指向的设备或模拟器之间完成一个或多个多路复用数据流。ADB服务器必须正确处理意料之外的传输中断。(比如:设备被物理拔除)

转载:http://www.eoeandroid.com/thread-200699-1-1.html  

posted on 2013-03-14 11:10 罗斯摩根 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/savagemorgan/archive/2013/03/14/2958965.html

Android Debug Bridge 技术实现原理相关推荐

  1. Android Debug Bridge(ADB)学习总结

    Android Debug Bridge Android调试桥(ADB)是一种多用途的命令行工具.通过它我们可以和模拟器或者设备通信.ADB是一个客户端-服务器程序,包括三个组成部分: 客户端(Cli ...

  2. Android开发工具——ADB(Android Debug Bridge) 一概览

    Android Debug Bridge (adb) 是一个android开发人员必会的多功能的调试工具,确实它的名字一样,它在开发者和目标机器之间,架起了一座bridge. adb的用法很简单,只要 ...

  3. [ADB]ADB(Android Debug Bridge)简介及基础(不包含命令)

    "Android Debug Bridge (adb) is a versatile command line tool that lets you communicate with an ...

  4. adb(Android debug bridge)命令

    From:https://www.cnblogs.com/huanyou/p/5133737.html ADB 用法大全: github 地址:https://github.com/mzlogin/a ...

  5. ABD — android debug bridge 简略介绍

    ABD - android debug bridge 简略介绍 文章目录 ABD - android debug bridge 简略介绍 一.adb是什么? 二.组成部分 三.adb 常用命令 四.总 ...

  6. Android Debug Bridge(adb)

    Adb google官方文档翻译,源文档地址如下 https://developer.android.google.cn/studio/command-line/adb Android Debug B ...

  7. Linux / Windows Subsystem for Linux (WSL) 安装 ADB (Android Debug Bridge,Android 调试桥)

    Linux / Windows Subsystem for Linux (WSL) 安装 ADB (Android Debug Bridge,Android 调试桥) Android 开发者网站 ht ...

  8. Windows 10 安装 ADB (Android Debug Bridge,Android 调试桥)

    Windows 10 安装 ADB (Android Debug Bridge,Android 调试桥) Android Debug Bridge (adb) is a command line to ...

  9. Android Debug Bridge (ADB) v1.0.31

    Android Debug Bridge (ADB) v1.0.31 Android SDK Platform Tools for Windows, Linux, Mac (all versions) ...

最新文章

  1. Fiddler抓取HTTPS包
  2. JVM 调优实战--常用JVM命令:jps/jinfo/jstat/jmap/jstack/jhat
  3. 牛客题霸 NC28 最小覆盖子串
  4. Bug之数据sql插入不显示
  5. 你以为文言编程只是闹着玩?三个月后,人家IDE、教程、包管理器都有了
  6. 免安装免配置 还免费的Spark 集群 --Databrickes Spark Clould
  7. linux localhost的修改
  8. Spark基础学习笔记11:Scala运算符
  9. [设计模式-创建型]建造者(Builder)
  10. Java:下拉列表绑定后台数据
  11. 程序反编译找pdf打开密码_即时密码保护PDF文件的免费工具
  12. 4r照片尺寸是多大_数码照片4D、4R、6RW是什么意思,怎样调整4D照片尺寸?
  13. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 ARIMA、AutoARIMA、LSTM、Prophet、多元Prophet 实现
  14. 华为路由器后台登录协议实现
  15. PyTorch创建自己的图像分类数据集
  16. PR2打印机参数设置
  17. Prometheus+Grafana环境搭建(windows版)
  18. 【C语言】OJ题:printf函数的返回值
  19. Go中的SSRF攻防战
  20. 三十六、前端基础 CSS

热门文章

  1. shell 字符串
  2. C++vector容器
  3. php tomcat配置_php+tomcat 配置运行环境
  4. Exchange Server 2016 独立部署/共存部署 (八)—— 边缘角色服务器
  5. 等级保护2.0常见问题集
  6. Redis学习总结(14)——图解redis五种数据结构底层实现(动图版)
  7. docker mysql5.7.19_Docker19.03.13下安装Mysql57
  8. Docker系列(二):Docker安装
  9. azkaban的部署过程中遇到的一些坑(部署篇)
  10. Atitit 设计模式的本质思考】