本地Android手机如何被远程访问和文件上传下载操作
--ADB连接专题
- 前言
这些天一直在思考一个生活中很常见的问题:我每天上班打卡都是手机到固定地点打卡,那能不能把手机放公司,然后远程连接和控制手机进行打卡或其它操作呢。你看,这其实是很经典的打工人的思维,但确实存在这样的用法的需求。
那么,有没有什么办法使用很简单的方式把它给搭建起来?即目标手机是受控的,但使用者和目标设备是物理上分隔的,但又能跟操作自己手上的设备一样很方便的对它进行控制和操作。
这就是很典型的“控制远程多个手机”的用法和需求,当然,这个描述和说法,一听就很有法律风险。^V^,我们换一个说法:我要怎么去做,才能把现在手上的这个手机,让别人远程连进来,并且操作和控制它?^V^。
这样一个简单需求通常包括三个不显眼的隐性需求:
- 远程操作的人,应能查看我当前的手机界面,并且能够控制坐标的方式(与我自己操作屏幕一样的)控制手机。
- 远程应能对手机进行文件的上传下载,包括使用互联网直接上传下载,包括从手机拉取推送文件到远程操作的这一侧。
- 远程应能对手机进行app应用安装卸载,以及跟操作本地手机一样装一些脚本或批处理控制的一些功能。(可能会涉及一些敏感权限)
如果要这样做的话,应该需要进行哪些准备工作?它们的执行和实现原理是什么?架构或者搭建的难易程度如何?
- 解决方案设想
这个思路方向和需求,其实有很多app或应用已经实现了这样的效果(包括以前我偷偷远程打卡的时候也是下载安装了这样的一些应用)。通常来说,实现这样的效果不外乎就是以下几种方式:
- 工作电脑引一根USB线插到电脑中,电脑用ADB来控制安卓手机;电脑中安装诸如toDesk/向日葵/TeamViewer等软件,或者干脆开远程桌面连接,由远程连到工作电脑上,再由工作电脑使用ADB来通过Scrcpy/QtScrcpy等界面工具操作手机。
- 直接在手机上安装toDesk安卓版等远程控制工具,将手机作为受控端;然后在远程使用配套的主控端app来进行直接控制。
- 手机把ADB引出来,桥接到公网端口上,找一个公网端口做TCP转发做映射;远程直接使用adb connect映射处理的公网IP和端口后,在本地电脑或手机通过Scrcpy/QtScrcpy等界面工具操作手机。
这按理来说,应该是第2种方式最为直接,对于“远程打卡”这个行为而言,场景功能也足够用了。大不了就多找几个软件进行一下功能对比,实在不行就找个root过的手机作为受控端,再不行就使用的时候看几个广告积攒一下免费使用次数,问题不大。
但是假设我作为一个研发人员,不想让那么多平台资源为我负重前行。我们对原理和扩展性有要求,我自己就有公网的服务器,想要可防可控,又要求搭建的系统架构简洁快速出成果,应该要如何做呢?
- ADB协议初探
一提到“控制手机”这个需求,首先想到的就是ADB操作。事实上,目前业界主流的是两个方向:
- ADB连接后,使用Scrcpy/QtScrcpy界面工具操作手机。
- 直接获取手机屏幕快照,根据坐标传递模拟触控点击事件来操作手机。
第二种方式常用于远程手机控制、云手机操控、手机群控等领域,第一种方式的应用范围会更广,毕竟建立了ADB连接,不仅能获取logcat、能进行文件推送拉取操作,某些情况还能进行app_process等绕过 context的提权操作。
本次篇章中,主要针对ADB连接这个方向,探索一下是否能够有办法,把本地手机的ADB连接剥离出来,映射到阿里云等具有公网IP云服务器的外网端口上,供远程adb connect客户端进行连接。
我们在电脑中,对旁边的Android手机进行操作,主要有插USB调试线和adb connect本地IP两种控制做法。其中,adb connect本地IP又划分为两种不同的连接方式:
- 手机开发者模式中开启【无线调试】,然后对照着公开的“IP地址和端口”连接。
- 手机插入USB调试线后,开启【USB调试】,电脑执行【adb tcpip 5555】命令将ADB映射的端口强制转换到手机的5555端口。每次重启手机后都需要做一遍这个操作。完成后就可以随意的找到手机的内网IP,使用“adb connect 内网IP”或“adb connect 内网IP:5555”,即可正常ADB连接到手机。
我们基于【adb connect本地IP】的做法,在电脑上开启Wireshark大白鲨抓包工具,抓取目标手机在建立本地ADB连接时产生的交互数据进行分析,如下图所示:

由于我们本次目标要做的不是“做一个ADB连接客户端”,而仅仅是想“将本地手机的ADB连接映射到外网”供外部ADB连接客户端进行远程访问和控制。因此,我们不需要过多的处理ADB协议的类型、应答收发数据内容。
我们从抓包数据中,可以简单获知两个数据特征:
- 所有的ADB连接数据,都是通过TCP来传输的。
- 所有的ADB连接数据,都在一个TCP连接中进行传输。如图中就是从57086<->5555
这样,我们可以从这个方向入手,通过TCP桥接转发的方式,来实现我们的手机远程控制的目的。
- 局限性和风险点
手机要想使用ADB访问本地IP的方式来控制手机,一定要先开启开发者模式。然后才允许进行“USB调试”或“无线调试”。而且它们的使用寿命各不相同,无线调试在手机界面关掉或者电脑adb connect连接断开后就会失效,USB调试就好很多,重启手机后也不会主动关闭,只是USB调试线插入电脑时,手机可能会弹出一个信任授权的弹框。
在使用差异上这里主要讨论两点:
- 【adb tcpip 5555】命令将ADB映射的端口强制转换到手机的5555端口。每次重启手机后都需要做一遍这个操作。
- adb connect本地IP这个做法,稳定性上相比USB调试线还是有一些差异,偶尔可能会有某些指令失败或者logcat拉取日志突然停顿、需要刷新一下ADB的问题。这些跟本次篇章主题无关但确实影响着使用体验,这方面的内容受不同手机型号和连接时局域网干扰情况有直接的关系。
- 总结
本系列的篇章中,尝试将本地的手机,通过公开ADB连接的办法,将某个本地手机映射称为外部公网的一个TCP端口,在使用完毕后就关闭掉这个访问端口。通过这种模式实现灵活的远程访问和控制本地Android手机,进而实现常见的“远程控制手机打卡”、“获取Logcat调试日志”、“推送安装APP”、“文件push推送和文件pull下拉”等常规的Android手机的控制操作。
这样,对于Android手机而言,ADB控制操作就能脱离了物理区域的限制,实现操作人员和目标实体手机在地理上分布和协同的工作方式。

7554

被折叠的 条评论
为什么被折叠?



