android自动化测试Monkeyrunner源码分析之四

时间:2021-06-17 05:39:27

4,monkeyrunner框架

MonkeyRunner的工作原理图如下,

android自动化测试Monkeyrunner源码分析之四

MonkeyRunner和目标设备打交道都是通过ChimpChat层进行封装分发但最终是在ddmlib进行处理的,其中囊括的方法大体如下:

  • 发送monkey命令:MonkeyRunner先通过adb shell发送命令"monkey -port  12345"在目标机器上启动monkey以监听端口接受连接,然后MonkeyRunner通过连接该端口建立socket并发送monkey命令。所有与界面相关的操作都是通过这种方式发送到目标机器的。
  • 发送adb协议请求:通过发送adb协议请求来与目标设备通信的,其实adb命令行客户端的所有命令最终都是通过发送遵循adb协议的请求来实现的,只是做成命令行方式方便终端用户使用而已
  • 发送adb shell命令:模拟adb命令行工具发送adb shell命令,只是不是真正的直接命令行调用adb工具,而是在每一个命令执行之前先通过上面的“发送adb协议请求“发送“shell:”请求建立一个和adb服务器通信的adb shell的socket连接通道,adb服务器再和目标设备的adb守护进程进行通信

写测试脚本时,最简单的如下,

device = waitForConnection();// 连接设备

连接设备之后,就可以调用MonkeyDevice类的方法。

 

MonkeyDevice类的方法可以分为三类:

1, 发送monkey命令,例如, presss/touch等方法

2, 发送adb shell命令   installPackage/ startActivity 等方法

3,发送adb协议请求    takeSnapshot/ reboot等方法

 

MonkeyRunner是一个CS(客户端-服务器)架构的框架,主要的代码控制逻辑是在PC端作为客户端来运行的;

但客户端需要驱动运行在目标Android系统的服务器端来做事情,比如驱动Monkey服务去调用对应的Android服务去注入事件以实现点击等操作功能。

服务器端和客户端的通信是通过Socket来实现的,而Socket又分为基于USB通信协议和TCP通信协议的,

也就是说用户既可以通过 USB线直接连接主机和Android目标机器;

也可以通过网络使用TCP协议来连接主机和 Android目标机器(使用命令:adb connect IP)。

但注意客户端并不会直接连接Android目标设备端中各个服务正在监听的端口,

而是连接主机端和该端口对应的转发端口,只要连接上转发端口,所有发向该端口的数据都会直接转发给Android目标机器端对应的服务监听的端口。

 

从上图可以看到,MonkeyRunner脚本的实现需要多个库的支持,常用的有以下这几个:

monkeyrunner库:MonkeyRunner最主要的库,脚本可以直接使用里面的MonkeyRunner,MonkeyDevice,MonkeyImage类来控制Android目标设备和应用以及截图等功能

chimpchat库:monkeyrunner库的很多功能都是通过调用chimpchat库相应的类来实现的,

比如调用MonkeyDevice类的安装应用包installPackage方法会直接调用到到chimpchat库的对应类AdbChimpDevice的installPackage方法,

然后该方法再会调用ddmlib的对应方法来通过Socket往ADB服务器发送命令,

然后ADB服务器会驱动Android目标机器端的adbd这个守护进程来实现安装应用包的请求。

所以chimpchat对于使用ADB进行通信的过程来说,相当于MonkeyRunner和ddmlib之间的代理中间层。

但对于使用Monkey进行通信的时候,chimpchat并不需要通过ddmlib来驱动Android目标机器的monkey服务,

而是chimpchat自己来完成socket建立和命令发送的功能

ddmlib库:在MonkeyRunner框架中,ddmlib主要是帮忙处理跟ADB服务器通信的事宜

hierarchyviewerlib库:当MonkeyRunner脚本需要用到控件相关的功能的时候就会使用到这个库来建立控件树和获取指定控件的相关属性

往下一层我们可以看到,MonkeyRunner跟Android目标机器进行通信根据需要做的事情不同而会驱动三种不同的服务去处理请求:

 

ADB服务:主要是处理非界面操作的相关请求,比如安装应用包等

monkey服务:主要是处理界面操作相关的请求,比如点击指定坐标等

ViewServer服务:主要是处理控件相关的请求,比如获取当前界面所有控件信息等

这里要注意的是MonkeyRunner框架并不会直接连接adbd这个Android目标机器的守护进程来驱动其做事情,

而是先和ADB服务器这个PC端的守护进程进行通信,然后再由ADB服务器来驱动adbd来完成请求的。

至于ADB服务器,ADB守护进程,ADB协议以及ADB命令行客户端等概念,第4章”ADB协议及服务“会详述。

 

最下面一层就是Android系统的核心服务了。MonkeyRunner的很多请求都是需要调用到Android的系统服务来完成的。

比如点击一个控件就需要通过monkey服务来调用Android系统的InputManagerService来注入按键事件来实现点击请求。

Device(ddmlib):代表的是通过ADB进行控制的设备

ChimpManager(chimpchat): 代表的是通过money进行控制的设备

AdbChimpDevice(chimpchat): 是一个更高层次的设备概念的抽象,它包含了以上的通过ADB控制的Device设备,

同时也包含了上面的通过monkey进行控制的设备,当调用过来的时候AdbChimpDevice会根据究竟是需要发送命令到ADB服务器

还是发送到monkey来决定使用的是哪个设备MonkeyDevice(monkeyrunner): 可以被测试脚本直接使用的一个高层抽象设备,

它所有的API基本上都是分发到AdbChimpDevice来执行的。