程序员人生 网站导航

第1章3节《MonkeyRunner源码剖析》概述:架构(原创)

栏目:综合技术时间:2015-04-08 08:59:21

天地会珠海分舵注:本来这1系列是准备出1本书的,详情请见早前博文“寻求合作火伴编写《深入理解 MonkeyRunner》书籍“。但由于诸多缘由,没有如愿。所以这里把草稿分享出来,所以毛病在所难免。有需要的就参考下吧,转发的话还请保存每篇文章结尾的出处等信息。

原理架构


MonkeyRunner使用起来非常的简单,只需要导入以下几个类基本上就可以满足测试脚本编写的需求,比如:

  • monkeyrunner.jar库的MonkeyRunner
  • monkeyrunner.jar库的MonkeyDevice
  • monkeyrunner.jar库的MonkeyImage

如果你想使用MonkeyRunner的控件相干的功能来让自己的代码可扩大性和可移植性更好,那末你也只需额外用上下面几个类就基本上能满足你的要求了:

  • chimpchat.jar库的:HierarchyViewer
  • hierarchyviewerlib.jar库的:ViewNode

如果你还想更简单的使用控件相干的功能,MonkeyRunner一样也能够满足你,只要你导入以下的类就能够使用EasyMonkeyDevice来调用其封装好的易用的API:

  • monkeyrunner.jar库的easy模块: EasyMonkeyDevice
  • monkeyrunner.jar库的easy模块: By

所以从脚本的角度来看,使用MonkeyRunner可以简单的理解成把需要的类给整合起来,然后通过代码把相应的业务逻辑通过各个类提供的方法给实现出来。?
这里写图片描述

但从MonkeyRunner实现的角度来看,事实并没有这么简单,为了满足MonkeyRunner脚本需要的功能,全部框架里面会使用到不同的库和不同的模块,乃至会驱动Android机器真个不同模块与服务来做事情。我们先看下MonkeyRunner的全部架构图:
这里写图片描述

MonkeyRunner是1个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脚本需要用到控件相干的功能的时候就会使用到这个库来建立控件树和获得指定控件的相干属性

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

  • ADB服务:主要是处理非界面操作的相干要求,比如安装利用包等
  • monkey服务:主要是处理界面操作相干的要求,比如点击指定坐标等
  • ViewServer服务:主要是处理控件相干的要求,比如获得当前界面所有控件信息等

这里要注意的是MonkeyRunner框架其实不会直接连接adbd这个Android目标机器的守护进程来驱动其做事情,而是先和ADB服务器这个PC真个守护进程进行通讯,然后再由ADB服务器来驱动adbd来完成要求的。至于ADB服务器,ADB守护进程,ADB协议和ADB命令行客户端等概念,第4章”ADB协议及服务“会详述。

最下面1层就是Android系统的核心服务了。MonkeyRunner的很多要求都是需要调用到Android的系统服务来完成的。比如点击1个控件就需要通过monkey服务来调用Android系统的InputManagerService来注入按键事件来实现点击要求。


作者:天地会珠海分舵
微信公众号:TechGoGoGo
微博:http://weibo.com/techgogogo
CSDN:http://blog.csdn.net/zhubaitian

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐