IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Android ADB工作原理探究

    FranzKafka95发表于 2024-02-27 15:11:40
    love 0
    Read Time:1 Minute, 39 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 0 %
    Sad
    Sad
    0 0 %
    Excited
    Excited
    0 0 %
    Sleepy
    Sleepy
    0 0 %
    Angry
    Angry
    0 0 %
    Surprise
    Surprise
    0 0 %

    The post Android ADB工作原理探究 first appeared on FranzKafka Blog.



沪ICP备19023445号-2号
友情链接