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.rhkb.cn/news/505958.html

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

相关文章

金融项目实战 02|接口测试分析、设计以及实现

目录 ⼀、接口相关理论 二、接口测试 1、待测接口&#xff1a;投资业务 2、接口测试流程 3、设计用例理论 1️⃣设计方法 2️⃣工具 4、测试点提取 5、测试用例&#xff08;只涉及了必测的&#xff09; 1️⃣注册图⽚验证码、注册短信验证码 2️⃣注册 3️⃣登录 …

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

基于Springboot + vue实现的办公用品管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

金融项目实战 01|功能测试分析与设计

前置内容&#xff1a;金融项目准备的内容笔记可直接看如下笔记 只看&#xff1a;一、投资专业术语 和 二、项目简介 两部分文章浏览阅读2.3k次&#xff0c;点赞70次&#xff0c;收藏67次。安享智慧理财金融系统测试项目&#xff0c;测试用例&#xff0c;接口测试&#xff0c;金…

【docker】exec /entrypoint.sh: no such file or directory

dockerfile生成的image 报错内容&#xff1a; exec /entrypoint.sh: no such file or directory查看文件正常在此路径&#xff0c;但是就是报错没找到。 可能是因为sh文件的换行符使用了win的。

python-42-使用selenium-wire爬取微信公众号下的所有文章列表

文章目录 1 seleniumwire1.1 selenium-wire简介1.2 获取请求和响应信息2 操作2.1 自动获取token和cookie和agent2.3 获取所有清单3 异常解决3.1 请求url失败的问题3.2 访问链接不安全的问题4 参考附录1 seleniumwire Selenium WebDriver本身并不直接提供获取HTTP请求头(header…

Bytebase 3.0.1 - 可配置在 SQL 编辑器执行 DDL/DML

&#x1f680; 新功能 新增环境策略&#xff0c;允许在 SQL 编辑器内直接执行 DDL/DML 语句。 支持为 BigQuery 数据脱敏。 在项目下新增数据访问控制及脱敏管理页面。 在数据库页面&#xff0c;支持回滚到变更历史的某个版本。 &#x1f514; 兼容性变更 禁止工单创建…

C++类的引入

C中类的前身 1> 面向对象三大特征&#xff1a;封装、继承、多态 2> 封装&#xff1a;将能够实现某一事物的所有万事万物都封装到一起&#xff0c;包括成员属性&#xff08;成员变量&#xff09;&#xff0c;行为&#xff08;功能函数&#xff09;都封装在一起&#xff…

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结&#xff1a; 农作物幼苗与杂草检测系统&#xff1a;基于YOLOv8深度学习框架&#xff0c;通过2822张图片训练了一个目标检测模型&#xff…

图像处理 | 图像二值化

在图像处理领域&#xff0c;图像二值化是一个重要的操作&#xff0c;它将彩色或灰度图像转换为只有两种颜色&#xff08;通常是黑白&#xff09;的图像。二值化广泛应用于文字识别、图像分割、边缘检测等领域&#xff0c;尤其在处理简洁和高对比度的图像时非常有效。本文将深入…

概率论与数理统计总复习

复习课本&#xff1a;中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布&#xff08;两点分布&#xff09; 7.二项分布 8.帕斯卡分布&#xff08;负二项分布&am…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言&#xff1a; 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream&#xff0c;许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下&#xff0c;龙蜥操作系统&#xff08;OpenAnolis&#xff09;作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

计算机网络期末复习(知识点)

概念题 在实际复习之前&#xff0c;可以看一下这个视频将网络知识串一下&#xff0c;以便更好地复习&#xff1a;【你管这破玩意叫网络&#xff1f;】 网络规模的分类 PAN&#xff08;个人区域网络&#xff09;&#xff1a;用于个人设备间的连接&#xff0c;如手机与蓝牙耳机…

IDEA Maven构建时报错:无效的目标发行版17

报错分析 报错原因&#xff1a;Maven 构建时&#xff0c;Java 版本配置不匹配 我安装的JDK版本是1.8&#xff0c;但由于种种原因&#xff0c;Maven构建时指定了 Java 17 作为目标发行版&#xff0c;从而导致错误 解决方案 首先&#xff0c;java -version&#xff0c;查看环…

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本&#xff1a;关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时&#xff0c;部分文档已经修改&#xff0c;而大部分没有修改&#xff0c;为了减少在众多已打开文档中来回跳转的不便&#xff0c;可以将没有修改的文档全部关闭&#xff0c;但目前提供的快速关闭窗…

Knowledge Editing through Chain-of-Thought

题目 通过思路链进行知识编辑 论文地址&#xff1a;https://arxiv.org/abs/2412.17727 摘要 大型语言模型 (LLM) 在广泛的自然语言处理 (NLP) 任务中表现出卓越的能力。然而&#xff0c;由于频繁重新训练的成本很高&#xff0c;让这些模型与不断发展的世界知识保持同步仍然是一…

运行.Net 7 Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录&#xff0c;双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…

spark——RDD算子集合

目录 算子转换算子示例mapflatMapReduceByKeyfilterdistinctglomgroupBygroupByKeySortBysortByKeyunion交集intersection和差集subtractjoinpartitionBymapPartitionsample 行动算子示例ForeachPartitionForeachSaveAsTextFileCountByKeyReducefoldfirst、take、counttop、tak…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node&#xff0c;请确保已具备较新的 node 环境&#xff08;>16.20.0&#xff09;&#xff0c;推荐使用 node 版本管理工具 nvm 来管理 node&#xff0c;这样不仅可以很方便地切换 node 版本&#xff0c;而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

Qt C++读写NFC标签NDEF网址URI

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …