Android ADB工作原理探究

ADB工作原理探究。
Views: 72
1 0
Read Time:1 Minute, 40 Second

日常做安卓系统开发的朋友一定会经常接触到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

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %
FranzKafka95
FranzKafka95

极客,文学爱好者。如果你也喜欢我,那你大可不必害羞。

文章: 85

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CNCN