adb端口转发

adb server 运行在 PC 端,监听 localhost:5037 端口的实现原理涉及 Socket 编程、进程管理、消息处理机制 以及 客户端-服务器架构(Client-Server Architecture)。其核心机制如下:


1. ADB 的三大核心组件

adb 采用 C/S 架构(Client-Server Architecture),主要包含三部分:

  1. adb client(客户端)

    • 运行在 PC 端,用户执行 adb 命令(如 adb devices, adb forward)。
    • 负责与 adb server 通信,发送命令并处理返回的结果。
  2. adb server(服务器)

    • 运行在 PC 端,监听 localhost:5037 端口,管理多个 adb 连接。
    • 负责与多个 adb client 交互,并管理 adbd 进程(运行在 Android 设备上)。
  3. adbd daemon(守护进程)

    • 运行在 Android 设备端,负责处理 adb server 发送的命令,并执行设备操作(如端口转发、文件传输、shell 命令)。
    • 通过 USB 或 TCP/IP 与 adb server 进行通信。

2. adb server 监听 localhost:5037 的实现原理

2.1 adb server 进程启动

当执行 adb 命令(如 adb devices)时:

  1. adb client 首先检查 adb server 是否已运行:

    LocalSocket socket;
    socket.connect("localhost", 5037);
    
    • 尝试连接 localhost:5037 端口,判断 adb server 是否在运行。
  2. 如果 adb server 未运行

    • adb client 启动 adb server 进程:
      adb_forkserver();
      
    • adb server 在后台运行,监听 localhost:5037 端口。

2.2 adb server 监听 localhost:5037

  1. adb server 采用 TCP Server 模型:

    • 使用 socket(AF_INET, SOCK_STREAM, 0) 创建监听 socket。
    • 绑定 localhost:5037,监听新的 adb 连接:
      int server_fd = socket(AF_INET, SOCK_STREAM, 0);
      sockaddr_in addr;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(5037);
      addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // 监听 127.0.0.1
      bind(server_fd, (struct sockaddr*)&addr, sizeof(addr));
      listen(server_fd, 5);
      
    • INADDR_LOOPBACK 限制了 adb server 只能在本机访问,确保安全性。
  2. 等待 adb client 连接

    • adb server 通过 accept() 等待 adb client 连接:
      int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addr_len);
      
    • adb client 连接后,adb server 解析客户端发送的命令(如 adb devicesadb forward)。

2.3 adb serveradbd 进程通信

  1. 建立 USB 连接

    • adb server 通过 USB 端口(usb_device_open())连接 Android 设备:
      usb_handle* usb = usb_device_open();
      
    • adb server 发送 host:transport-usb 命令,绑定到 Android 设备。
  2. 建立 TCP 连接

    • 如果 adb 采用 Wi-Fi 连接(adb connect <device_ip>:5555),则:
      int device_socket = socket(AF_INET, SOCK_STREAM, 0);
      sockaddr_in addr;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(5555);
      addr.sin_addr.s_addr = inet_addr(device_ip);
      connect(device_socket, (struct sockaddr*)&addr, sizeof(addr));
      
    • adb server 连接 adbd,数据流通过 TCP 传输。
  3. 数据交互

    • adb server 解析 adb client 的请求,如 adb shelladb pushadb forward,并通过 USB/TCP 发送给 adbd
    • adbd 执行命令后返回结果,adb server 再返回给 adb client

3. adb server 监听 5037 的意义

  1. 管理多个设备

    • adb server 统一管理所有连接的 Android 设备,包括 USB 和 TCP/IP 设备。
  2. 提高效率

    • 避免每次 adb 命令都重新建立与 adbd 的连接,减少资源消耗。
  3. 允许并发命令

    • 多个 adb client 可以同时向 adb server 发送命令,例如:
      adb shell
      adb push file.txt /sdcard/
      
    • adb server 处理多个请求,提高并发能力。

4 在中转机上运行 ADB

###############
# 在中转机上跑
###############
sudo killall adb
sudo nohup adb -a nodaemon server &
sudo adb devices
ADB_ID=ABCD1234  # adb devices 显示的设备ID
sudo adb -s ${ADB_ID} tcpip 5555
sleep 3
sudo adb -s ${ADB_ID} forward tcp:5555 tcp:5555
sudo adb -s ${ADB_ID} forward tcp:8000 tcp:8000###############
# 在测评机上跑
###############
adb connect 100.10.20.3:5555

这段脚本的作用是 在一台“中转机”上运行 ADB 代理,然后 在另一台“测评机”上通过 ADB 远程连接 Android 设备。整个流程可以分为 “中转机设置”“测评机连接” 两个部分。

4.1 在中转机上运行 ADB 代理

sudo killall adb
  • 终止所有正在运行的 adb 进程,确保 ADB 重新启动时不会有冲突。
sudo nohup adb -a nodaemon server &
  • 启动 adb server,并使其在后台运行:
    • -a:监听所有网络接口(默认 adb server 只监听 localhost)。
    • nodaemon:不以守护进程方式运行,适用于 nohup 后台执行。
    • nohup:防止进程因 SSH 断开而退出。

4.2 确保设备连接

sudo adb devices
  • 列出所有已连接的设备,格式:
    List of devices attached
    ABCD1234    device
    
  • 这里的 ABCD1234 是 Android 设备的唯一标识符(serial number)。
ADB_ID=ABCD1234  # adb devices 显示的设备ID
  • 将设备 ID 存入变量,方便后续使用。

4.3 切换 ADB 到 TCP/IP 模式

sudo adb -s ${ADB_ID} tcpip 5555
  • 让 Android 设备开启 TCP/IP ADB 监听
    • 设备上的 adbd 进程会开始监听 TCP 端口 5555,允许远程 ADB 连接。
    • 设备必须已启用 adb 调试模式,并连接到 USB,否则命令会失败。
sleep 3
  • 等待 3 秒,确保 adbd 进程成功切换到 tcpip 模式。

4.4 在中转机上做端口转发

sudo adb -s ${ADB_ID} forward tcp:5555 tcp:5555
  • 端口转发(Forwarding)
    • 中转机的 localhost:5555 代理 Android 设备的 localhost:5555
    • 这样,外部设备可以通过 中转机:5555 访问 Android 设备的 adb 端口。
sudo adb -s ${ADB_ID} forward tcp:8000 tcp:8000
  • 额外转发 端口 8000,可能用于 Android 设备上运行的某个 Web 服务或调试工具(如 WebSocketgRPC)。

adb connect 10.1.2.3:5555
  • 让测评机 通过网络连接到中转机(10.1.2.3)的 5555 端口
    • 10.1.2.3 是中转机的 IP 地址。
    • 因为中转机 已将 5555 端口转发到 Android 设备,所以测评机的 adb connect 最终连接的是 Android 设备

步骤命令作用
1. 杀死旧的 ADB 进程sudo killall adb避免冲突
2. 启动 ADB 服务器sudo nohup adb -a nodaemon server &监听 ADB 连接
3. 获取设备 IDadb devices识别 Android 设备
4. 启用 TCP/IP ADBadb -s ${ADB_ID} tcpip 5555让 Android 设备监听 5555 端口
5. 端口转发(ADB 代理)adb -s ${ADB_ID} forward tcp:5555 tcp:5555让中转机监听 5555 端口
6. 测评机连接adb connect 10.1.2.3:5555远程访问 Android 设备

4.7 防止 ADB 断连

如果 Android 设备 adbd 进程自动关闭,导致 adb connect 失效,可以:

while true; do adb connect 10.1.2.3:5555; sleep 5; done
  • 每 5 秒尝试重新连接

4.8 让 ADB 连接更稳定

在 Android 设备上执行:

setprop service.adb.tcp.port 5555
stop adbd
start adbd
  • 使 ADB 端口持久化,避免设备重启后 adb tcpip 5555 失效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…

【Git原理和使用】Git 分支管理(创建、切换、合并、删除、bug分支)

一、理解分支 我们可以把分支理解为一个分身&#xff0c;这个分身是与我们的主身是相互独立的&#xff0c;比如我们的主身在这个月学C&#xff0c;而分身在这个月学java&#xff0c;在一个月以后我们让分身与主身融合&#xff0c;这样主身在一个月内既学会了C&#xff0c;也学…

静态路由配置与调试——计算机网络实训day1

文章目录 操作前准备一、实验目的二、实验要求三、实验过程1、在R1和R2上配置设备名称。基本配置设备命名 2、在R1和R2上配置接口IP地址&#xff0c;并查看IP地址的配置情况。3、在R1和R2上配置静态路由&#xff0c;并查看路由表。静态路由缺省路由&#xff08;默认路由&#x…

农产品直播带货方案拆解

作为一名经验丰富的营销策划人道叔&#xff0c;今天我来拆解一下咱们4A营销广告圈的这份《直播天府川农好物带货方案》&#xff0c;让你能学到很多实用的策略和技巧&#xff0c;直接应用到你的策划工作中去。 首先&#xff0c;咱们看看背景分析。 助农直播现在可是个大热门&a…

【Qt】控件概述和QWidget核心属性1(enabled、geometry、windowTitle、windowIcon、QRC机制)

一、控件概念 界面上各种元素、各种部分的统称&#xff08;如按钮、输入框、下拉框、单选复选框...&#xff09; Qt作为GUI开发框架&#xff0c;内置了各种的常用控件&#xff0c;并支持自定义控件。 二、控件体系发展 1.没有完全的控件&#xff0c;需要使用绘图API手动绘制…

【杂谈】-50+个生成式人工智能面试问题(四)

7、生成式AI面试问题与微调相关 Q23. LLMs中的微调是什么&#xff1f; 答案&#xff1a;虽然预训练语言模型非常强大&#xff0c;但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力&#xff0c;但仍需要一些LLMs微调过程&#xff0c;开发者通过这个过程提升它…

spring boot 多数据源集成mysql、postgresql、phoenix、doris等

如何搭建多数据源项目只要以下简单几步; 一. 创建核心在config.datasource文件夹里 二. 引入相对应的jar包 三. 创建数据库连接配置 四. 写逻辑代码进行验证 1.DataSource package com.irootech.config.datasource;import java.lang.annotation.*;Target({ElementType.MET…

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络&#xff1a; 静态配置路由动态路由协议 在本文&#xff0c;我们将学习关于静态路由的各种概念&#xff0c;例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

Dependency check 通过Maven构建时,配置Mysql数据库遇到的三个坑

使用过Dependency check的同学&#xff0c;一定会遇到这个问题—— 每次执行依赖扫描时&#xff0c;由于网络问题会导致NVD下载种子数据的过程中的种种失败&#xff0c;不仅浪费了大量时间&#xff0c;还会因为下载文件的不完整性直接导致依赖检测的失败。所以我在使用Dependen…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性&#xff1a;在项目开发、测试及生产环境中&#xff0c;日志是定位系统问题的关键手段&#xff0c;对系统维护与问题排查至关重要。采集方式 常规采集&#xff1a;按天保存日志文件至专门目录&#xff0c;文件名包含项目名、端口及日期&…

【数据库】三、SQL语言

文章目录 三、SQL语言1 概述2 数据定义(DDL)2.1 定义数据库2.2 定义基本表2.3 修改基本表2.4 删除基本表 3 数据操作(DML)3.1 数据查询3.1.1 单表查询3.1.2 连接查询3.1.3 嵌套查询3.1.4 集合查询 3.2 数据更新3.2.1 插入数据3.2.2 修改数据3.2.3 删除数据 4 数据控制(DCL)5 视…

Unity中 Xlua使用整理(二)

1.Xlua的配置应用 xLua所有的配置都支持三种方式&#xff1a;打标签&#xff1b;静态列表&#xff1b;动态列表。配置要求&#xff1a; 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录&#xff08;如果是H…

Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局 Matplotlib 是 Python 中最常用的数据可视化库&#xff0c;它提供了强大的功能来绘制不同类型的图表。在实际应用中&#xff0c;通常需要将多个图表绘制在同一个画布上&#xff0c;这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplot…

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列&#xff1a;原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下&#xff0c;分布式系统架构愈发复杂&#xff0c;消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”&#xff0c;在古代&#xff0c;各地的信件、物资运…

Photon最新版本PUN 2.29 PREE,在无网的局域网下,无法连接自己搭建的本地服务器

1.图1为官方解答 2.就是加上这一段段代码&#xff1a;PhotonNetwork.NetworkingClient.SerializationProtocol SerializationProtocol.GpBinaryV16; 完美解决 unity 商店最新PUN 2 插件 不能连接 &#xff08;环境为&#xff1a;本地局域网 无外网情况 &#xff09; …

消息中间件类型介绍

消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据&#xff0c;实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍&#xff1a; 1.RabbitMQ 特点&#xff1a; • 基于AMQP&#…

51单片机(二)中断系统与外部中断实验

中断即单片机因为某些原因E暂定现在的工作P0&#xff0c;转去做其他的工作P1&#xff0c;完了之后继续之前的事P0&#xff0c;其他工作P1就是中断程序&#xff0c;原因E就是中断事件&#xff0c;原因由外部发生&#xff0c;程序不能预测到的是硬中断&#xff0c;可以由程度触发…