测试工具GAutomator的研究(二)——GAutomator大致原理

文章目录

GAutomator大致原理

GAutomator(以下简称GA)首先在PC上用adb connect命令和安卓端建立链接。这个链接是基于TCP的。通过在python测试脚本中可以控制在cmd终端发送adb的其他命令,比如tab点击命令,模拟屏幕点击,等等。为了能够发送自己定义的命令,比如获取游戏组件树结构,获取某个按钮,需要将这些数据通过adb forward命令进行转发。adb forward命令在客户端的测试脚本和adb之间建立一条本地的tcp链接,同时安卓端的adbd和游戏又建立一条tcp链接。所以一方面PC端的测试脚本需要占用一个端口,而安卓端的游戏也需要占用一个端口。安卓端相关使用端口的代码在U3DAutomation.dll里面,具体代码详见源码或后续文章讲解。

实际上,adb forward命令是现在大多数手机助手的核心。为了测试adb forward命令的可行性,我们可以做一个实验。他的格式类似:adb forward tcp:1234 tcp:5678。表示他将其中一个端口收到的数据转发到另一个端口。

  1. 新建一个Unity工程,给任何一个激活物体挂上一个ServerSocket.cs脚本,在里面开启一个socket链接。这个socket链接将占用8885端口,监听这个端口收到的消息同时往这个端口发送消息。代码将在本文最后展示。然后将这个工程打包成apk,安装在MUMU模拟器上。
  2. 新建一个Unity工程,给任何一个激活物体挂上一个ClientSocket.cs脚本,在里面开启一个socket链接。这个socket链接将占用8889端口,监听这个端口收到的消息同时往这个端口发送消息。我们一会儿将直接在Unity中启动它。

现在万事具备。一步一步看端口的占用情况:
现在mumu模拟器和Unity是开着的。(为了保证adb是关着的,你可以在cmd中输入adb kill-server)。然后查看两个进程的PID,分别为:

NemuHeadless.exe : 21792
Unity.exe: 2760

然后启动adb同时连接mumu模拟器 adb connect 127.0.0.1:7555

NemuHeadless.exe : 21792
Unity.exe: 2760
adb.exe: 19056

然后通过netstat -no查看端口7555的占用情况

TCP    127.0.0.1:7555         127.0.0.1:63852        ESTABLISHED     21792
TCP    127.0.0.1:63852        127.0.0.1:7555         ESTABLISHED     19056 

可以看到NemuHeadless.exe进程占用了7555端口,而adb.exe使用端口63852和7555端口进行TCP链接,这就是adb connect的作用。实际上,在真机上测试的时候,是安卓机器上的adbd进程占用的端口,在这里,我们可以把NemuHeadless.exe看作是adbd。
现在开启转发命令:adb forward tcp:8889 tcp:8885。adb将把从8889端口收到的数据,转发给另一个设备的8885端口,或者将8885收到的数据转发给本机上的8889端口。
然后开启安卓端安装好的游戏,再启动PC端的Unity工程,在他们通信完成之前,我们再来看看端口占用的情况:

TCP    127.0.0.1:7555         127.0.0.1:63852        ESTABLISHED     21792
TCP    127.0.0.1:63852        127.0.0.1:7555         ESTABLISHED     19056
TCP    127.0.0.1:8889         127.0.0.1:64310        ESTABLISHED     19056
TCP    127.0.0.1:64310        127.0.0.1:8889         ESTABLISHED     2760 

现在只能看到8889端口的占用情况,原因可能是MuMu模拟器使用的是自己虚拟机上的端口,而不是本机的端口。8889被adb端口占用,而Unity则开启一个端口64310与它开启链接。这说明Unity与adb之间又建立了一个TCP链接,并且Unity是TCP客户端(即Unity是主动发起链接的一方)。
我们来看看结果:
PC端Unity的情况:
在这里插入图片描述
安卓端游戏界面的情况:
在这里插入图片描述
现在整个过程大致的框架如下:

PC(Untiy <---> adb) <------> Android(adbd <---> Game)

PC端通过adb和Android建立一个TCP链接,同时在adb forward tcp:8889 tcp:8885命令之后,adb将监听8889端口,准备Unity与它建立一个TCP链接。Android端同理。这三个TCP链接将四个对象连在一次,而adb和adbd充当PC端进程与安卓端进程的通讯媒介。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值