adb默认端口分析

Posted by on March 15, 2022

ADB 分层

  • ADB为 Android Debug Bridge(调试桥)的缩写,本质上是一个 C/S 架构的命令行工具。整个ADB模块由如下几部分组成(详细参见system/core/adb/OVERVIEW.txt和transports.txt):

  • The ADB server(adb):运行在PC端的一个后台应用程序,用来检测Android Devices的连接或去除,进而维护设备状态列表。另外,ADB Server也会负责协调Client、Services和Android devices之间传输数据。
  • The ADB daemon (adbd) : 运行在Android Devices或Emulator上的后台守护进程。该进程主要是用来连接ADB Server,并通过USB(或者TCP)为adb clients提供一些services服务。
  • The ADB command-line client: 执行adb 命令的终端。具体来说,会连接adb server并向adb server发送请求命令。若是发现adb server没有启动,则会自动唤起adb server.
  • Services: adb具备的一些能力可以抽象成服务(services),供The ADB command-line client访问。可以分为 Host Services和Local Services两种

adb默认5555端口分析

  • 路径在 system/core/adb/daemon/main.cpp

      
    int adbd_main(int server_port) {
      bool is_usb = false;
      if (access(USB_FFS_ADB_EP0, F_OK) == 0) {
          usb_init();
          is_usb = true;
      }
      std::string prop_port = android::base::GetProperty("service.adb.tcp.port", "");
      if (prop_port.empty()) {
          prop_port = android::base::GetProperty("persist.adb.tcp.port", "");
      }
      int port;
      int port;
      if (sscanf(prop_port.c_str(), "%d", &port) == 1 && port > 0) {
          D("using port=%d", port);
          setup_port(port);
      } else if (!is_usb) {
          setup_port(DEFAULT_ADB_LOCAL_TRANSPORT_PORT);
      }
      return 0;
    }   
    
    
  • 首先会去判断 service.adb.tcp.port 和 persist.adb.tcp.port中是否配置了端口号,如果没有配置端口号

在去判断是否挂在了 USB_FFS_ADB_EP0,如果挂载了,则会监听 USB_FFS_ADB_EP0,如果没有挂在,则会监听 DEFAULT_ADB_LOCAL_TRANSPORT_PORT=5555端口

基本真机都有EP0,EP1,EP2,节点,模拟器是没有的默认会启动初始化5555并且监听此端口

要彻底关闭和打开ADB

  
       SystemProperties.set("ctl.start", "adbd");    SystemProperties.set("ctl.stop", "adbd");