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

adb的用法很简单,只要看完SDK文档关于ADB的部分,(android-sdk-linux_86/docs/guide/developing/tools/adb.html),再稍加练习,基本上就满上就能很熟练的使用了。但是对它的实现感兴趣,最好的途径就是阅读源代码,它android 2.2的位置是:

system/core/adb
adb是slient-server架构的,包含三个部分,

1、 client,运行于开发机器,你可以在shell中调用adb命令,其它的Android工具比如ADT插件和DDMS也包含adb client。

2、 server,作为后台进程同样运行于开发机器,server负责管理client和运行于目标机器或者emulator的守护进程之间的通信,就像一座桥一样。

3、 daemon,运行于目标机或者emulator的守护进程。

上面这段话是SDK里面翻译过来的,我是看adb的代码看的有点迷糊,才去看sdk的,再返回来看代码的时候思路清晰很多。

adb的功能强大,而且支持多平台,但是它的代码却非常精简,只有1.5万行左右,代价就是比较晦涩难懂(看懂以前),代码里面随处可见的各种宏让人眼花缭乱,其中一个重要的宏ADB_HOST,是用来区分本地主机和目标机器的。

client和server调用的是adb

LOCAL_CFLAGS += -O2 -g -DADB_HOST=1  -Wall -Wno-unused-parameterLOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORYLOCAL_MODULE := adb

而emulator/device调用adbd

LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameterLOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCELOCAL_MODULE := adbd

1、 在HOST端,adb会fork出一个守护进程(不是adbd),即server,而父进程继续处理client请求,所有的client通过TCP端口号5037进行与server通信,而server创建local socket与remote socket,前者用于和client通信,后者用与远端进行通信,emulator通过TCP,real device则通过usb。

2、在emulator/device端,adbd也创建local socket和remote socket,前者与通过jdwp与Java虚拟机进层通信,后者通过TCP/USB与HOST通信。

因此整个流程应该是这样的,

1、client调用某个adb命令

2、adb进程fork出一个子进程作为server

3、server查找当前连接的emulator/device

4、server接收到来自client请求

5、server处理请求,将本地处理不了的请求发给emulator/device

6、位于emulator/device的adbd拿到请求后交给对应的java虚拟机进程。

7、adbd将结果发回给server

8、server讲结果发回给client

如下图:

___________________________________
| |
| ADB Server (host) |
| |
Debugger <---> LocalSocket <-------------> RemoteSocket |
| ^^ |
|___________________________||_______|
||
Transport ||
(TCP for emulator - USB for device) ||
||
___________________________||_______
| || |
| ADBD (device) || |
| VV |
JDWP <======> LocalSocket <------------> RemoteSocket |
| |
|___________________________________|

更多相关文章

  1. android Application Component研究之Service
  2. Android之ActivityManager与Proxy模式的运用
  3. Android中AIDL实现进程通信(附源码下载)
  4. SSH服务器与Android通信(3)--Android客户端发送数据
  5. Android(安卓)P解决Socket通信Tcp粘包问题
  6. android学习笔记之十二进程通信(IPC)
  7. [5] Zygote
  8. Android系统启动之Zygote
  9. Android内存泄漏检测工具大全

随机推荐

  1. Android入门二(五大布局)
  2. [置顶] Android增量更新与CMake构
  3. 自定义视图(组合控件)
  4. 从gpu到chromium compositor(cc)详解andr
  5. Android 5.X Activity过渡动画,以及漂亮的
  6. GridView中实现元素填充剩余空间(自适应)
  7. android基础--获取sdcard的总容量
  8. android studio中的文本替换
  9. 测试Android真机访问电脑主机web项目服务
  10. Android Studio每日小技巧