第5章2节《MonkeyRunner源码剖析》Monkey原理分析

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

每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就是在Monkey.java这个类里面的,也就是说Monkey.java就是整个Monkey应用的入口类。

Monkey作为一个命令行应用,启动的过程中必然会去把命令行参数给解析出来;同时作为一个MonkeyRunner的服务,在启动完成后,很自然就能想到它必然会循环去等待获取主机发过来的命令。这些都不难理解,其实在Monkey从开始启动到准备好循环等待网络命令过来的过程中主要需要涉及以下动作:

整个启动的流程都是发生在Monkey这个类里面的,所以本章主要围绕的就是Monkey类的对应的方法来对以上的整个启动流程进行阐述。Monkey类作为Monkey这个jar包的入口类,包含了很多成员变量和成员方法,我们不会,也不需要把所有的都分析到,我们会尽量把要用到的部分都覆盖到就足够了。这里我们先看下Monkey类的类图以及其主要成员变量和成员方法,然后会在今后的小节中结合该类的源码分析来把上面提到的Monkey启动的整个流程给呈现给大家。

图5-2-1 Monkey类图

首先我们先关注该类的一系列成员变量,它们主要指定了事件的来源以及事件注入需要用到的系统服务的引用等,具体的使用我们会在往下的几个小节对他们描述清楚,现在大家现有一个大概的印象就可以了, 以下对关键成员变量进行相应的解析:

然后我们在看Monkey类的关键方法,首先有个入口main方法作为整个Monkey运行的入口,时所有事情发生的开始。然后剩余的那介个方法主要就是去处理整个Monkey启动过程中需要做的事情了。以下对这些关键成员方法进行相应的解析:

当然,虽然Monkey这个入口类是整个服务启动的主要处理控制类,但因为如上所述在启动过程中需要初始化事件源,且在最后启动完成后会循环获取事件来执行,所以整个流程还会涉及到事件源的初始化和事件的执行。下面我们就以monkey作为一个MonkeyRunner的服务而启动的流程作为例子,看下整个过程的一个序列图:

图5-2-2 Monkey服务启动流程序列图

在Monkey服务启动的过程中,MonkeyRunner会首先执行目标设备的安卓系统中的”/system/bin/monkey”这个shell脚本来准备好Monkey的运行环境并指定”/system/framework/monkey.jar”这个jar包以及对应的入口类““com.android.commands.monkey.Monkey” 来开始运行monkey应用;跟着操作系统会找到monkey.jar包里面Monkey这个入口类的入口方法main进行调用;之后就进入前面描述的一系列Monkey类成员方法的调用来完成启动流程;最后在调用成员方法runMonkeyCycles时就进入了一个循环来不停从网络事件源MonkeySourceNetwork来获取MonkeyRunner从主机端发送过来的命令,然后该命令会被翻译成对应的MonkeyEvent事件,并执行对应的事件注入来模拟用户操作以实现测试自动化。

往下的各个小节就会一步步的以这个序列图为基础来向大家阐述清楚整个启动流程,但至于事件源的MonkeyEvent事件的更详细的分析我们会放在下一章进行讲解。

——— 未完待续———

作者:天地会珠海分舵 微信公众号:TechGoGoGo 微博: CSDN:

闹里有钱,静处安身。

第5章2节《MonkeyRunner源码剖析》Monkey原理分析

相关文章:

你感兴趣的文章:

标签云: