天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 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来注入按键事件来实现点击请求。


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

第1章3节《MonkeyRunner源码剖析》概述:架构(原创)的更多相关文章

  1. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  2. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

  3. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  4. 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化

    老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...

  5. 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述

    老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述   HierarchyViewer库的引入让M ...

  6. 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程   poptest是国内唯一一家培养测试开发工程师的培训机 ...

  7. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  8. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...

  9. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  10. 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化

    老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化   首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...

随机推荐

  1. 每天的学习经验:SharePoint 2013 定义自己添加的产品清单。Callout菜单项、文档关注、SharePoint服务机端对象模型查询

    前言: 前一段时间一直都比較忙.没有什么时间进行总结,刚好节前项目上线.同一时候趁着放假能够好好的对之前遇到的一些问题进行总结. 主要内容有使用SharePoint服务端对象模型进行查询.为Share ...

  2. Quartz(GUI)图形界面程序----Quartz Web

    下载.设置和运行Quartz(GUI)图形界面程序----Quartz Web 一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用 ...

  3. Android应用UI架构

    这个标题听起来可能有点大.事实上这里主要就是讨论一个应用程序的UI组件,是全用Activity还是全用Fragment.或者是二者皆有.以及使用Activity和Fragment的一些注意事项.  A ...

  4. codeforces 260 div2 A,B,C

    A:水的问题.排序结构.看看是否相同两个数组序列. B:他们写出来1,2,3,4,的n钍对5余.你会发现和5环节. 假设%4 = 0,输出4,否则输出0. 写一个大数取余就过了. B. Fedya a ...

  5. C#开发中使用配置文件

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  6. Android 异步消息处理机制 让你在深入了解 Looper、Handler、Message之间的关系

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 非常多人面试肯定都被问到过,请问And ...

  7. WinDbg调试.NET

    WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...

  8. 【leetcode】Clone Graph(python)

    类似于二叉树的三种遍历,我们能够基于遍历的模板做非常多额外的事情,图的两种遍历,深度和广度模板相同也能够做非常多额外的事情,这里举例利用深度优先遍历的模板来进行复制,深度优先中,我们先訪问第一个结点, ...

  9. Open the Lock

    Problem Description Now an emergent task for you is to open a password lock. The password is consist ...

  10. Oracle 用户权限管理方法

    Oracle 用户权限管理方法 sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最 ...