Posted: October 28, 2009 |
Version: 0.1 almost
在android平台上写TCP
/UDP的Socket测试程序时,因为不知道把端口重定向到emulator上的端口上,而吃了很多困-_-!于是,今天下午了解一下adb这个工具,发现adb的整个架构很有意思,记录一下:
adb:全称为Android Debug
Bridge,它是一个多用途的工具,可以让你管理模拟器实例或者android设备的状态。简而言之,它是一个调试工具!
adb是一个客户端—服务器程序,它包括三个组件:
1.client:
which runs on your development machine. You can invoke a client
from a shell by issuing an adb command. Other Android tools such as
the ADT plugin and DDMS also create adb
clients.(不过自己捣鼓了一会,也没发现如何在Eclipse中使用adb的借口-_-!明天看一下DDMS再说……)
感性的认识,也就是右边这张图片:
2. server:
which runs as a background process on your development machine.
The server manages communication between the client and the adb
daemon running on an emulator or device.
这里值得一提的是,这里的client和server应该都只是线程的,而不是像我之前所理解的是两个进程。因为在Process
Explorer中,我只找到了一个adb进程。在打开模拟器之前,该进程共有两个线程;而打开了模拟器之后,一共有四个线程,见下面两张图。再次把Eclipse关闭,发现这个adb进程还在:线程为两个,说明这两个应该就是服务器端。
3.daemon(守护进程):
which runs as a background process on each emulator or device
instance.
client与server的连接(当开启adb命令行时):
客户端检查下服务进程是否存在?如果不存在的话,就启动服务进程。然后服务进程绑定到5037端口开始监听客户端的请求。
server与daemon的连接:
server通过扫描5555到5585的奇数端口来定位模拟器实例,一旦在这些端口中找到模拟器中的daemon,就和这个端口建立连接。
server工作的单一性:
虽然server在两端能连接多个client和模拟器,但是一次只能把commands传送给一个模拟器。也就是说,你要操作另外一个模拟器了,你必须用下面的命令来切换(Directing
Commands to a Specific Emulator/Device Instance):
adb -s
结语:
因为觉得adb整个架构还蛮好玩的(从来没写过这种架构的完整程序,以后可以看下adb的源码,应该是开源的吧!),所以就写下了这篇文章,不知道是不是做了一件无聊的事(⊙o⊙)?