《MonkeyRunner源码剖析》 - 书籍
文章平均质量分 95
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。
天地会珠海分舵
互联网老兵,全栈小学生
展开
-
第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件
到了现在,万事已经俱备,控件树这个东风也已经就绪了,我们也终于可以火烧赤壁大展拳脚,通过控件的ID在控件树中找到我们想要的控件了。 HierarchyViewer只允许用户通过控件的ID去查找控件,这比Robotium,UiAutomator和Appium这些框架是少了很多查找控件的方式的,但聊胜于无。 HierarchyViewer去尝试通过控件ID的方法叫做findViewById,它有两个重原创 2015-12-08 11:02:18 · 2292 阅读 · 1 评论 -
第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树
在上几节的描述中,我们把HierarchyViewer初始化好,也把ViewServer给装备好了。那现在距离获得一个控件去操作它是万事具备只欠东风了,欠了那一股春风了?欠了的是建立控件树这个东风,因为HierarchyViewer根据ID去获取一个控件之前是需要先建立好控件树,然后从该控件树上根据ID去查找到目标控件的。 那么这一小节我们就先去看下HierarchyViewer是如何去ViewS原创 2015-12-08 11:01:46 · 2381 阅读 · 0 评论 -
第14章7节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-获取版本号
这里获取的版本号有两个,一个是ViewServer自身的版本号,一个是ViewServer当前使用协议的版本号。 我们这里为什么需要获取ViewServer版本以及其协议版本呢?其实主要原因是ViewServer有些功能在老版本上是不支持的,比如HierarchyViewer在列出当前所有Activity窗口的时候,针对获取焦点的窗口会根据不同的ViewServer协议版本而作不同处理,请看源码示原创 2015-12-08 11:00:57 · 2051 阅读 · 0 评论 -
第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer
在获得ViewServer的运行状态后,如果ViewServer还没有启动的话,HierarchyViewer的setupViewServer的下一步就会去启动ViewServer。调用的方法是DeviceBridge.startViewServer,我们进去看看:190 public static boolean startViewServer(IDevice device) {191原创 2015-12-08 11:00:24 · 1979 阅读 · 0 评论 -
第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态
上一小节我们描述了HierarchyViewer是如何组建ADB协议命令来实现ViewServer的端口转发的,在端口转发设置好后,下一个要做的事情就是去检测目标设备端ViewServer线程是否已经启动起来了。我们进入setupViewServer调用的DeviceBridge的isViewServerRunning方法:165 public static boolean isViewS原创 2015-12-08 10:59:54 · 1950 阅读 · 0 评论 -
第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发
在初始化HierarchyViewer的实例过程中,HierarchyViewer会调用自己的成员方法setupViewServer来把ViewServer装备好,那么我们这里先看下这个方法: 39 private void setupViewServer() { 40 DeviceBridge.setupDeviceForward(mDevice); 41原创 2015-12-08 10:57:43 · 1877 阅读 · 0 评论 -
第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化
既然要使用HierarchyViewer来获取控件信息,那么首先我们看下在脚本中,我们是怎么获得HierarchyViewer的,看下面一段脚本代码:1 device = MonkeyRunner.waitForConnection() 2 device.wake()3 device.startActivity(component="com.example.android.notepad/c原创 2015-12-08 10:56:02 · 1929 阅读 · 0 评论 -
第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述
HierarchyViewer库的引入让MonkeyRunner可以以面向控件的方式进行脚本编写,那么它是怎么做到这一点的呢?它的实现原理又是怎么样的呢?在这一小节开始我们就会开始一起揭开它的神秘面纱。 HierarchyViewer这个框架的工作需要ViewServer的协同工作,它们是以CS(Client-Server)架构来协同工作的。我们在上一章已经学习了如何让做为Server端的View原创 2015-12-08 09:18:28 · 2186 阅读 · 0 评论 -
第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程
到此为止我们描述的MonkeyRunner对应用的点击拖放等操作都是直接通过指定坐标点来实现的,比如下面触摸一个坐标点为(60,90)的按钮的脚本例子:1 device.touch(60,900,MonkeyDevice.DOWN_AND_UP)代码14-1-1 直接使用坐标点操作应用 这样子做的话代码会存在以下几大缺点:缺乏易用性:要操作某个控件之前需要先想办法如通过工具来定位该控件的坐标点可原创 2015-12-08 09:17:42 · 1730 阅读 · 0 评论 -
第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结
最后我们对MonkeyRunner启动的过程做一个总结,当然,其中也包括启动Monkey,虽然它不属于启动过程的一部分:monkeyrunner这个shell脚本会先设置一些运行环境的系统属性保存到JVM的System.Propery里面然后该脚本会通过java -jar直接运行sdk下面的monkeyruner.jar然后操作系统直接回调到monkeyrunner在MonkeyRunnerSta原创 2015-12-08 09:16:19 · 1520 阅读 · 0 评论 -
第8章6节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动Monkey
大家可能会觉得奇怪,为什么启动目标设备端的monkey进程会放在“运行测试脚本”这一节之后来阐述。 纵观前面整个MonkeyRunner的启动流程,我们看到并没有提及到monkey进程启动的地方。那么就奇怪了,monkey是什么时候被MonkeyRunner启动起来的呢? 我们的测试脚本一开始时几乎毫无例外的都需要执行一个调用:MonkeyRunner.waitForConnection(),如果原创 2015-12-08 09:15:42 · 1924 阅读 · 0 评论 -
第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本
MonkeyRunner在准备好AndroidDebugBridge和DeviceMonitor等服务之后,就基本上是解决了和目标设备通信的问题了,那往下需要做的就是把测试脚本运行起来了。178 public static void main(String[] args) {179 MonkeyRunnerOptions options = MonkeyRunnerOptions.p原创 2015-12-08 09:15:14 · 1667 阅读 · 0 评论 -
第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge
上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个主要的事情:715行startAdb:开启AndroidDebugBridge722-723行:初始化android设备监控并启动DeviceMonitor设备监控线程。 其中第一点我们上一小节已经做了详尽分析了,那么我们往下就去分析下第2点。 DeviceMonitor主要的功能就是监控是否有原创 2015-12-08 09:14:34 · 2147 阅读 · 0 评论 -
第8章3节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge
用户在命令行运行monkeyrunner命令来执行测试脚本的时候ADB服务器有可能还没有起来,AndroidDebugBridge类的主要作用之一就是去开启一个新的进程来启动ADB服务器,这样我们的测试脚本才能发送命令给ADB服务器去驱动目标设备做事情,比如安装或者删除待测应用的安装包等。 MonkeyRunner在启动的过程中会牵涉到一系列的调用并关联到不同的类来做不同的事情。 图8-3-1原创 2015-12-08 09:13:40 · 1807 阅读 · 0 评论 -
第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数
MonkeyRunnerStarter是MonkeyRunner启动时的入口类,因为它里面包含了main方法.它的整个启动过程主要做了以下几件事情:解析用户启动MonkeyRunner时从命令行传输进来的参数: 因为MonkeyRunner需要根据指定的参数才能做事情,比如输入的一个需要执行的脚本。如果确实不知道任何参数的话它就会进入MonkeyRunner的交互模式,其实就是Jythong的交互原创 2015-12-08 09:13:01 · 1780 阅读 · 0 评论 -
第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化
首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目标设备端的,流程控制逻辑代码是在PC端运行的,但很多命令请求的执行是在目标机器端执行的。这不像其他框架如UiAutomator是所有东西都完全在目标设备端运行的。 这里我们首先应该去看的不是MonkeyRunnerStarter这个类里面的main这个入口函数,因为monkeyrunner其实是个shell脚本,它就在你的s原创 2015-12-08 08:45:05 · 1346 阅读 · 0 评论 -
第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事件源来阐述学习Monkey是如何处理MonkeyRunner过来的命令的。以下总结下MonkeyRunner从启动Monkey开始到如何处理完成一个命令的流程总结如下:MonkeyRunner通过ADB发送shell命令”monkey --port 12345”来启动MonkeyMonkey启动运行进入runMonke原创 2015-12-08 08:44:11 · 1297 阅读 · 0 评论 -
第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
在事件生成并放入到命令队列后,Monkey类的runMonkeyCycles就会去调用相应事件源的getNextEvent来获的事件来执行事件注入,那么这一小节我们通过MonkeyKeyEvent这个事件的注入方法来看下事件注入过程是怎么样的。 往系统注入按键事件最终是通过调用InputManager提供的方法来实现的,在Android系统中,按键事件是由InputManager来收集并由Wind原创 2015-12-08 08:43:19 · 1515 阅读 · 0 评论 -
第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些事件排队放入一个由事件源维护的队列,然后其他地方如Monkey类的runMonkeyCycles方法就可以去把队列里面的事件取出来进一步进行处理了。那么这里我们先看下属于MonkeySourceNetwork内部类的命令队列的类图: 图6-6-1 命令队列类图 整个继承关系非常清晰简洁,CommandQueue接口定原创 2015-12-08 08:42:31 · 1241 阅读 · 0 评论 -
第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有一大部分命令在翻译后需要转换成对应的事件,然后放入到命令队列里面等待执行。Monkey在取出一个事件执行的时候主要是执行其injectEvent方法来注入事件,而注入事件根据是否需要往系统注入事件分为两种:需要通过系统服务往系统注入事件:如MonkeyKeyEvent事件会通过系统的InputManager往系统窗口注原创 2015-12-08 08:41:39 · 1589 阅读 · 0 评论 -
第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
在第2节中我们看到了MonkeySourceNetwork是如何从Socket中获取MonkeyRunner发送过来的命令字串的,但是最后如何将它翻译成事件的代码我们还没有进行分析,因为在那之前我们还没有了解命令翻译类的相关知识。那么经过第3小节对命令翻译类的学习后,我们就可以继续往下分析MonkeySourceNetwork的getNextEvent中是如何翻译命令字串的了。 我们回看下第2小节原创 2015-12-08 08:40:29 · 1341 阅读 · 0 评论 -
第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行了事,而有些是需要在解析后创建相应的事件类实例并添加到命令队列里面排队执行。负责这部分工作的就是命令翻译类。那么我们往下还是继续在MonkeySourceNetwork这个范畴中MonkeyCommand类是怎么一回事: 图6-3-1 MonkeyCommand族谱 图中间的MonkeyCommand是一个接口,主要定原创 2015-12-08 08:39:34 · 1291 阅读 · 0 评论 -
第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令是以字符串的形式交互的,那么事件处理的第一步当然是先去获得MonkeyRunner发送过来的字串命令了。 在事件源MonkeySourceNetwork初始化的时候构造函数会创建一个ServerSocket来监听来自客户端的链接和数据,但这个时候客户端并不能真正实现和服务端通信,因为该ServerSocket尚处于阻塞状态。既原创 2015-12-08 08:38:23 · 1351 阅读 · 0 评论 -
第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览
在上一章中我们有简要的介绍了事件源是怎么一回事,但是并没有进行详细的描述。那么往下的这几个小节我们就需要把这方面的知识给补充完整。 这一节我们先主要围绕MonkeySourceNetwork这个事件源来学习事件源的框架结构。首先,要理解事件源,必须先搞清楚几个问题:事件从哪里来? Monkey的事件来源有多个方面,但是作为MonkeyRunner框架的一部分,它的事件来源主要是来自MonkeyRu原创 2015-12-08 08:36:55 · 2348 阅读 · 0 评论 -
第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles(原创)
Monkey启动之后需要在整个MonkeyRunner的测试生命周期中提供服务,也就是说,一旦我们调用monkeyrunner命令来执行指定的测试脚本的时候,只要monkeyrunner还没有退出,那么Monkey就会一直提供服务,一直监听获取并处理从MonkeyRunner测试脚本发送过来的相应的命令。那么要实现这种一直监听的处理我们很自然就想到需要用一个循环来处理了。其实Monkey也不例外,我们往下会分析它是怎原创 2015-03-07 22:30:40 · 2233 阅读 · 0 评论 -
第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源(原创)
事件源代表要注入系统的命令事件数据是从哪里过来的。这一小节我们不会对事件源的实现进行深入的分析,因为下一章会做这个事情。这里大家对事件源有个基本概念就足够了。原创 2015-03-07 22:26:11 · 1689 阅读 · 0 评论 -
第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用(原创)
上一节我们描述了monkey的命令处理入口函数run是如何调用optionProcess方法来解析命令行参数的。启动参数主要时去指导Monkey时怎么运行起来的,但Monkey作为MonkeyRunner框架的一部分,更重要的是如何将从MonkeyRunner测试脚本出发的命令转化成事件来注入到系统中以进行测试自动化。如前面所说,run方法除了对启动参数进行解析之外还做了很多其他的事情,比如这一小节需要分析的去建立对原创 2015-03-07 22:21:19 · 1797 阅读 · 0 评论 -
第5章4节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 命令行参数解析(原创)
设置好Monkey的CLASSPATH环境变量以指定”/system/framework /framework/monkey.jar“后,/system/bin/monkey这个shell脚本就会通过app_process命令指定monkey的入口类” “com.android.commands.monkey.Monkey”找到main函数开始运行。在运行之前会有一些初始化的工作需要做,其中很重要的一项就是去把用户提原创 2015-03-07 22:13:59 · 1791 阅读 · 1 评论 -
第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览(原创)
每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就是在Monkey.java这个类里面的,也就是说Monkey.java就是整个Monkey应用的入口类。原创 2015-03-07 21:51:10 · 1728 阅读 · 0 评论 -
第5章1节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 官方简介(原创)
在MonkeyRunner的框架中,Monkey是作为一个服务来接受来自MonkeyRunner客户端发送过来的命令,然后针对每条命令请求进行相应的处理,所以它并不是作为一个随机压力测试的工具来运作原创 2015-03-07 21:42:34 · 2131 阅读 · 0 评论 -
第4章4节《MonkeyRunner源码剖析》ADB协议及服务: ADB命令行客户端使用简介(原创)
从前面几个小节我们知道ADB命令行客户端是存在与主机端的一个命令,用户可以使用该命令来发送服务请求到ADB服务器,ADB服务器再判断该服务请求是主机服务请求还是本地服务请求来决定是否应该将请求传送给远程adbd守护进程进行执行。原创 2015-03-07 21:19:31 · 1918 阅读 · 0 评论 -
第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)
本文档的目的是去文档化一个客户端请求ADB服务器往adbd守护进程发送文件相关的请求。请查看OVERVIEW.TXT文档去查看(ADB服务器和adbd守护进程)相关信息,查看SERVICES.TXT去学习其他更多的可用请求。翻译 2015-03-07 19:26:20 · 1709 阅读 · 0 评论 -
第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)
ADB服务器端在接受到ADB客户端发送过来的命令后会进行相应的处理,如果是主机服务就在ADB服务器内部进行处理,如果是本地服务就会发送给Android目标机器端的adbd守护进程进行处理。因为ADB相关的源代码不在我们源码分析的范围之内,所以我们很有必要把官方提供的ADB服务器支持的所有服务在这里描述下。虽然本人对自己的英语水平相当有信心,但总担心有词不达意的时候,所以翻译的过程中把英文也保留了下来以供大家参考。翻译 2015-03-07 19:06:47 · 1726 阅读 · 0 评论 -
第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览OVERVIEW.TXT翻译参考(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。关于ADB的实现记录。I. 概览安卓调试桥(ADB)是用来: 跟踪管理所有连接上或者运行在开发主机上的安卓设备或者模拟器实例。其实现了各种控制翻译 2015-03-07 18:18:56 · 2848 阅读 · 0 评论 -
第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例(原创)
在上一节的第一个“增加日记”的示例中,我们并没有看到日记是否真的增加成功了,也就是说当时并没有进行结果比较。其实在MonkeyRunner框架中,测试结果的比较往往都是通过截屏比对来完成的。而截屏比对相关的方法主要是由MonkeyImage这个类来实现的,但截屏这个动作确是由MonkeyDevice提供的takeSnapshot这个方法来达成的。所以这一节我们主要就是去熟悉截屏比对相关的测试代码编写的基础知识。原创 2015-03-07 18:01:24 · 1613 阅读 · 0 评论 -
第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例(原创)
上一节我们学习了如何通过MonkeyRunner这个类的静态方法waitForConnection来把后台和设备建立好连接,且看到了在建立连接成功后,该方法会返回来一个MonkeyDevice的实例对象。那么这一节我们就通过编写一些脚本代码示例来了解学习下MonkeyDevice这个类的使用方法原创 2015-03-07 17:36:02 · 2483 阅读 · 0 评论 -
第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。MonkeyRunner这个类可以说是编写monkeyrunner脚本的入口,因为这个类有一个很重要的方法watForConnection,它原创 2015-03-07 17:00:17 · 2149 阅读 · 0 评论 -
第2章4节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之菜单简介(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。NotePad窗口Activity之菜单简介这里我们总共用到两种类型的菜单,一种叫做Context Menu,就是上下文菜单;一种叫做Opti原创 2015-03-06 00:18:35 · 1515 阅读 · 0 评论 -
第2章3节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NoteEditor简介(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。我们在增加和编辑一个日记的时候会从NotesList这个Activity进入到NoteEditor这个Activity。增加和编辑的时候的控件原创 2015-03-06 00:11:36 · 1633 阅读 · 0 评论 -
第2章2节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NotesList简介(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。NotePad窗口Activity之NotesList简介上一节我们简要描述了测试对象NotePad的主要功能模块,那么这一节开始我们就会对每原创 2015-03-06 00:00:44 · 1888 阅读 · 0 评论