Physical Address:
ChongQing,China.
WebSite:
日常做安卓系统开发的朋友一定会经常接触到ADB,在大多数时候我们只需要记住一些常见的ADB命令,借助这些命令来帮助我们进行调试和诊断。没有必要可能也是没有机会去了解其内部的工作原理,今天这篇文章跟大家一起探究ADB的工作原理,了解其背后的工作机制。
ADB全称为Android Debug Bridge,其工作机制遵循C/S架构,这里先上一张图让大家有个直观的了解:
这里我们可以看到,adb的结构上主要包含三部分:
client:adb client是指直接与用户交互的程序,我们在teminal终端内通过adb命令即启动client,client程序位于我们的Host侧(PC);
server:adb server用于打通adb client与adb daemon之间的通信,adb server程序位于我们的Host侧(PC),工作在后台,使用者是无感知的;
daemon:adb daemon程序位于我们的Android设备内部,也就是adbd,通过tcp/usb等与adb server通信,从而接收来自adb client的指令并执行;
这三者具体是怎么通信的呢,可以参考下图:
当我们在shell终端敲下adb命令时,即启动了adb client程序,其会检查当前是否存在adb server进程,如果不存在adb server则会启动一个adb server;在adb server启动后,会绑定到默认的5037端口,监听来自adb client的命令,也就是说所有的adb client都会通过5037端口与adb server进行交互;与此同时,adb server会开始扫描检查所有的Android设备,与安卓设备内的adbd进行通信;
adbd在启动时同样会绑定一个端口,adbd绑定的端口可以通过编译配置进行设定,这里可以通过三个属性进行设定:service.adb.listen_addrs、service.adb.tcp.port、persist.adb.tcp.port,如果这几个属性值都没有,则会直接绑定默认端口(5555);这部分的逻辑我们可以在adbd中找到:
//packages/modules/adb/daemon/main.cpp
// If one of these properties is set, also listen on that port.
// If one of the properties isn't set and we couldn't listen on usb, listen
// on the default port.
std::vector<std::string> addrs;
std::string prop_addr = android::base::GetProperty("service.adb.listen_addrs", "");
if (prop_addr.empty()) {
std::string prop_port = android::base::GetProperty("service.adb.tcp.port", "");
if (prop_port.empty()) {
prop_port = android::base::GetProperty("persist.adb.tcp.port", "");
}
#if !defined(__ANDROID__)
if (prop_port.empty() && getenv("ADBD_PORT")) {
prop_port = getenv("ADBD_PORT");
}
#endif
int port;
if (sscanf(prop_port.c_str(), "%d", &port) == 1 && port > 0) {
D("using tcp port=%d", port);
// Listen on TCP and VSOCK port specified by service.adb.tcp.port property.
addrs.push_back(android::base::StringPrintf("tcp:%d", port));
addrs.push_back(android::base::StringPrintf("vsock:%d", port));
setup_adb(addrs);
} else if (!is_usb) {
// Listen on default port.
addrs.push_back(
android::base::StringPrintf("tcp:%d", DEFAULT_ADB_LOCAL_TRANSPORT_PORT));
addrs.push_back( android::base::StringPrintf("vsock:%d",DEFAULT_ADB_LOCAL_TRANSPORT_PORT));
setup_adb(addrs);
}
} else {
addrs = android::base::Split(prop_addr, ",");
setup_adb(addrs);
}
上面我们已经知道了其大致的架构,接下来我们看看当我们输入adb命令时,其到底是如何执行的,这里同样给出一张图:
其具体执行过程:
1.用户输入adb命令,adb client调用某个 adb
命令
2.adb 进程 fork 出一个子进程作为 adb server
3.adb server 查找当前主机中连接的安卓设备,包括模拟器和物理机
4.adb server 接收到来自 adb client 请求
5.adb server 处理请求,将相关请求发给安卓设备
6.位于安卓设备中的 adbd
拿到请求后交给对应的JVM虚拟机
7.adbd将结果返回给adb server
8.adb server将结果返回给adb client