老李推荐:第1章3节《MonkeyRunner源码剖析》概述:架构
老李推荐:第1章3节《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是一个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来注入按键事件来实现点击请求。
老李推荐:第1章3节《MonkeyRunner源码剖析》概述:架构的更多相关文章
- 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件
老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...
- 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态
老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态 poptest是国内唯一 ...
- 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer
老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer poptest是国内唯一一家培养 ...
- 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化
老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...
- 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述
老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述 HierarchyViewer库的引入让M ...
- 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程
老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程 poptest是国内唯一一家培养测试开发工程师的培训机 ...
- 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结
老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
- 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本
老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化
老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化 首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...
随机推荐
- HTTP笔记(一)
最近在看<图解HTTP>.全书以图解的形式生动形象的讲解了HTTP协议.本文是根据该书整理的笔记,方便以后回顾. HTTP的诞生 HTTP又称超文本传输协议(HTTP,HyperText ...
- 表单界面的兼容PC手机端解决方案
就当写一篇随笔吧~上星期还在做加盟模块(兼容微信端),这星期已经加班做快递扫码模块(react+node),所以我感觉只有弹药备足了才能稍微轻松些应对各种需求.实话说在同个部门的大佬面前差距确实大,如 ...
- 【转】Docker —— 从入门到实践
http://yeasy.gitbooks.io/docker_practice/content/index.html Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud ...
- Omi教程-插件体系
插件体系 Omi是Web组件化框架,怎么又来了个插件的概念? 可以这么理解: Omi插件体系可以赋予dom元素一些能力,并且可以和组件的实例产生关联. omi-drag 且看这个例子: 点击这里→在线 ...
- 最近发现的.net core中的一些bugs
1.使用.net core的过程中发现TypeInfo.GetCustomAttributes()只能写在主线程中,否则如果该自定义特性存在于nuget中就会报错,貌似nuget中的dll仅在主线程使 ...
- android保存照片到相册的一些事
由于最近工作需求的原因,有一个功能就是将webView里面的照片保存到本地,并且能够直接在相册中有一个及时的反馈. 项目中,具体是实现流程是这样的设计webview点击交互事件,当点击webview中 ...
- 使用jQuery快速高效制作网页特效-----------------------------之jQuery事件与动画
1.基础事件 分为三个事件 1.1 window事件 所谓window事件,就是当用户执行某些会影响浏览器的操作时,而触发的事件. 1.2 鼠标事件 鼠标事件顾名思义就是当用户在文档上移动或单击鼠标时 ...
- maven springmvc启动问题
1.环境 SpringMVC + Maven + mybatis 2.报错提示 严重: Error configuring application listener of class org.spri ...
- React组件开发(二)表达式
var obj = { name:"xiaoming", age:"18" } var Hello= React.createClass({ render:fu ...
- 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具)
因为这段时间不是装系统就是换硬盘,导致装了还几次MySql,每次都记不住都要上网找教程,着实麻烦,所以这次干脆直接写到博客上好了,便于自己也便于他人: 百度云:http://pan.baidu.com ...