从零搭建一套远程手机的桌面操控和文件传输的小工具

从零搭建一套远程手机的桌面操控和文件传输的小工具

--ADB连接专题

  • 一、前言

前面的篇章中,我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作,从原理和实际部署和操作层面上,从零开始,搭建出一个最小巧的"在本地控制位于远程且连接了局域网的Android手机设备"的系统架构和部署方案。

在方案中,本文主要阐述实现原理和事件的交互方式,讲述如何通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法。从而实现远程访问本地Android手机的ADB数据的操控方式。

  • 二、方案选型

既然是TCP数据转发,而且运行在Android设备当中,通常需要在Android的APP中进行一个ADB中继线路调度,通过监听或连接转发,实现远程连接过来的ADB数据能够正常发送到Android手机的"无线调试"端口,或者5555的默认ADB数据端口。

我们随机在某个检索引擎中对"转发adb数据"这个描述进行数据启发性搜索。发现真的是好简单,几下的步骤就搞定了,内容如下:

通过检索到的数据内容来看,既然ADB数据是基于网络TCP连接来进行传输,这么看来,如果要实现ADB中继的效果,将会面临的问题有两点:

  1. 做ADB桥接工作Android中继APP,到底是TCP服务端来做监听?还是做TCP客户端去连别人
  2. 如何把阿里云服务器上的公网端口上监听并接收的数据,同步转发到这个手机的APP桥接的链路上,进而发送到本地手机的"无线调试"端口或5555默认端口?

这样的话,我们可以简单的找一个黑板或白纸,在上面罗列出所有的问题和设想的解决方案,然后像走迷宫一样,把不可行的路径给划掉,剩下的就是最可能实现的候选解的方案。方案最优解自然也包含在内。

  1. Android中App的ADB中继线路,应该是TCP客户端,由它来连接阿里云服务器的某个TCP端口,当连接完成并且存在远程ADB客户端连接时,所有的ADB数据全部经由这个TCP协议的Socket来做转发。

(因为手机位于局域网内,监听TCP端口没有意义,阿里云服务器的连接无法直接连接进来)

  1. 阿里云服务器上监听的TCP端口,用于远程ADB客户端adb connect连接进来的公网端口,应该是单独使用的,而且最好只支持一个客户端连接。只有这样才能最大限度的保障ADB过程数据不会被加工和干扰,也就是这条链路是ADB独占式使用的。这样的话,手机APP的ADB中继线路就要连接阿里云服务器的另一个TCP监听端口,收到ADB数据后,才在这两个Socket客户端之间做完全的数据交换。

(如果都连接到同一个端口,就需要区分出哪个是A路和B路,就需要增加额外的指令。当然这样做也是可以的,只要能确保手机ADB中继线路要先于远程ADB客户端之前连接上来就能实现正常的数据转发。)

  1. Android中App不用急着连接手机5555默认ADB端口,应等待远程ADB客户端发出数据过来到手机时,再向本地手机5555端口建立新的TCP客户端连接,连接成功后再转发数据和接收数据返回即可。

经过以上三步,即可正常的实现ADB数据的桥接和数据中继转发。然而问题来了,Android的App如何知道要连接阿里云服务器的哪个端口?以及什么时候连接、什么时候断开这条中继ADB线路的连接?

这个问题我觉得很简单,App启动的时候直接连接云服务器的固定端口,App退出的时候就断开云服务器的TCP连接即可。^V^。

如果想要灵活的控制,想在App运行的过程中,需要的时候再连接,不需要的时候就断开ADB中继,那么就需要App和阿里云服务器之间保持一条TCP长连接,由外部APP或网页根据需要去下发指令来开启或关闭ADB中继线路。

(其实没有必要搞那么复杂,净整些没用的)

这样,经由我们简单的分析,就初步得出了本次主题目标"通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法",从理论上应该是没有问题,正常能数据收发的。

附注:在这里,还会有另外一个问题:假设不想让"无线调试"端口变动,能不能用代码的方式,自动将默认ADB调试端口映射到5555上

我们也简单的检索了一下,发现很难,目前现有的方案都是在Root的手机上使用su权限来执行的,如下图所示。专门为了一个每次重启手机后只要设置一次就可以一直使用的功能,专门限定在Root环境着实没有必要。手动执行adb tcpip 5555去配置吧。反正重启手机这个操作频率非常的低。

  • 三、GitHub上可供参考的方案

接下来就处于实际搭建环境的验证思路的过程。作为一个正常的中国人,为了不闭门造车,在动手之前,我们应该要先去GitHub等开源方案上找一找,看看是不是已经有现成的方案了,有的话直接部署验证就行,没有的才说要自己动手实现一遍进行开发。非常的合理。

我们在GitHub上使用【ADB】和【Remote ADB】作为检索关键字,提取了一堆的内容,粗略筛选了一下,大致有下面4个项目库,跟本次主题沾边,内容描述如下:

  1. AdbLib,下载路径为:https://github.com/cgutman/AdbLib
  2. 也是adbLib,下载路径为:https://codeload.github.com/tananaev/adblib
  3. AdbLib,下载路径为:https://codeload.github.com/tytydraco/LADB
  4. RemoteADB,下载路径为:https://github.com/jarhot1992/Remote-ADB

事实上,这一堆的GitHub内容,不能说毫无用处,基本就是瞎扯淡。都是一些如下图这样的内容,我们自己又不做ADB客户端,整这堆花里胡哨的有什么用。还不如专注自己的主题方向。

  • 四、程序的部署方式和运作原理

如上面第二章节的内容所述:【

  1. Android中App的ADB中继线路,应该是TCP客户端,由它来连接阿里云服务器的某个TCP端口,当连接完成并且存在远程ADB客户端连接时,所有的ADB数据全部经由这个TCP协议的Socket来做转发。

(因为手机位于局域网内,监听TCP端口没有意义,阿里云服务器的连接无法直接连接进来)

  1. 阿里云服务器上监听的TCP端口,用于远程ADB客户端adb connect连接进来的公网端口,应该是单独使用的,而且最好只支持一个客户端连接。只有这样才能最大限度的保障ADB过程数据不会被加工和干扰,也就是这条链路是ADB独占式使用的。这样的话,手机APP的ADB中继线路就要连接阿里云服务器的另一个TCP监听端口,收到ADB数据后,才在这两个Socket客户端之间做完全的数据交换。

(如果都连接到同一个端口,就需要区分出哪个是A路和B路,就需要增加额外的指令。当然这样做也是可以的,只要能确保手机ADB中继线路要先于远程ADB客户端之前连接上来就能实现正常的数据转发。)

  1. Android中App不用急着连接手机5555默认ADB端口,应等待远程ADB客户端发出数据过来到手机时,再向本地手机5555端口建立新的TCP客户端连接,连接成功后再转发数据和接收数据返回即可。

我们就简单的搭建了一个位于阿里云服务器的程序,以及一个运行于本地Android手机的APP程序,用于ADB中继线路和ADB数据的桥接,实现效果如下:

本地手机App的ADB中继连接的输出日志如下:

这样,当一切就绪后,在远程的电脑上,使用【adb connect 120.78.211.195:20377】,即可正常的ADB连接到目标手机。

远程电脑中,安装并使用Scrcpy/QtScrcpy界面工具操作手机,双击后会弹出新的界面框,显示本地手机当前的桌面界面,远程操作人员可以直接在图中滑动和点击像操作本地放在电脑旁边的手机一样,操作远程的手机设备,如下图所示:

  • 五、前提条件和风险点

前文也说了,要想实现这么一套逻辑,需要依赖3大硬件和软件条件,如下:

  1. 有一台具有公网IP和端口的云服务器(阿里云/腾讯云/华为云等)。
  2. 有一台Android手机作为被控制的目标手机。^V^。
  3. 目标Android手机要开启【开发者模式】并使用【adb tcpip 5555】命令将ADB映射的端口强制转换到手机的5555端口。

三者缺一不可,搞定了之后,就可以使用电脑或者手机版本的Scrcpy/QtScrcpy客户端,对被控制的手机进行直接的操作啦,非常的简单。

  • 六、总结

一顿操作,我们采用了最简洁的方式,实现了通过ADB中继线路的方式,实现外部阿里云的公网服务器某一个公开的TCP端口对应映射一台内网手机的ADB链路的连接办法。从而实现远程访问本地Android手机的ADB数据的操控方式。

如果要并发上线的话,这个模式可以支持成千上万的手机连接到公网服务器的映射端口,每个手机只需要分配一个单独的端口即可。

服务器也可以灵活的实现使用的时候再分配端口给某个具体的目标被控手机,通过下发指令的方式让目标手机主动建立ADB中继连接,降低服务器资源的负担。


上一篇:本地Android手机如何被远程访问和文件上传下载操作

下一篇:编写中。

相关推荐
openinstall全渠道统计19 分钟前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫41 分钟前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫1 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
双鱼大猫2 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫2 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫2 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android
楼台的春风2 小时前
【详细讲解在STM32的UART通信中使用DMA机制】
stm32·单片机·嵌入式硬件·mcu·物联网·嵌入式·信息与通信
苏金标3 小时前
android 快速定位当前页面
android
一去不复返的通信er5 小时前
SVD预编码
算法·信息与通信·预编码算法·通信原理
雾里看山6 小时前
【MySQL】内置函数
android·数据库·mysql