老李推荐:第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览
老李推荐:第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览
每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就是在Monkey.java这个类里面的,也就是说Monkey.java就是整个Monkey应用的入口类。
Monkey作为一个命令行应用,启动的过程中必然会去把命令行参数给解析出来;同时作为一个MonkeyRunner的服务,在启动完成后,很自然就能想到它必然会循环去等待获取主机发过来的命令。这些都不难理解,其实在Monkey从开始启动到准备好循环等待网络命令过来的过程中主要需要涉及以下动作:
运行环境设置: 在monkey这个shell脚本中设置好运行monkey应用需要的环境
命令参数解析: 将启动monkey命令行应用时输入的参数解析出来
获取系统服务引用:既然monkey需要注入事件到系统里面,那么必然是通过系统提供出来的服务来进行注入的,所以在启动过程中会获得需要的系统服务的引用,比如对 WindowManagerService服务的引用
初始化事件源: 一个事件源代表了事件的来源,比如作为MonkeyRunner的一个服务时接收来自网络的由MonkeyRunner发送过来的命令事件,作为一个独立运行的随机压力测试应用时由Monkey自身生成的事件,这些事件的来源都会有相应的类进行处理。所以在Monkey启动的过程中会对这些事件源的类进行初始化,以便往下进入循环等待事件的时候从对应的事件源中获得需要处理的事件
循环等待事件的到来: 启动完成后,Monkey应用就会进入一个循环状态,不停的检测是否有事件需要执行
整个启动的流程都是发生在Monkey这个类里面的,所以本章主要围绕的就是Monkey类的对应的方法来对以上的整个启动流程进行阐述。Monkey类作为Monkey这个jar包的入口类,包含了很多成员变量和成员方法,我们不会,也不需要把所有的都分析到,我们会尽量把要用到的部分都覆盖到就足够了。这里我们先看下Monkey类的类图以及其主要成员变量和成员方法,然后会在今后的小节中结合该类的源码分析来把上面提到的Monkey启动的整个流程给呈现给大家。
图5-2-1 Monkey类图
首先我们先关注该类的一系列成员变量,它们主要指定了事件的来源以及事件注入需要用到的系统服务的引用等,具体的使用我们会在往下的几个小节对他们描述清楚,现在大家现有一个大概的印象就可以了, 以下对关键成员变量进行相应的解析:
mAm: 对ActivityManagerService服务的引用,以便往后通过它来进行Activity相关的操作
mWm: 对WindowManagerService服务的的引用,以便往后通过它来进行Windown窗口相关的操作
mPm: 对PackageManager的引用,以便往后通过它进行Package相关的操作
mSeed: 指导monkey产生伪随机事件流的种子数
mServerPort: Monkey服务监听的端口号,默认会被初始化成12345,这样运行在主机端的应用如monkeyrunner命令就可以通过该端口和目标机器进行通信了
mEventSource: 事件源实例,不同的事件源有不同的类来实现,但它们都统一实现了MonkeyEventSource这个接口。比如来自网络的控件相关的事件源是由MonkeySourceNetworkViews这个类来实现的
然后我们在看Monkey类的关键方法,首先有个入口main方法作为整个Monkey运行的入口,时所有事情发生的开始。然后剩余的那介个方法主要就是去处理整个Monkey启动过程中需要做的事情了。以下对这些关键成员方法进行相应的解析:
main: Monkey应用的入口方法,所有事情开始的地方
run: 命令运行入口方法。里面做了很多事情,比如调用processOptions去解析命令行参数,初始化事件源,调用runMonkeyCycles去循环获取并执行命令等
processOptions: 解析命令行参数
getSystemInterfaces: 获得上面的ActivityManager,WindowManager和PackageManager的引用
runMonkeyCycles: 循环从事件源的EventQueue里面获取事件命令执行,其中EventQueue是一个事件队列,保存的是将要执行的事件。比如从网络MonkeyRunner过来的命令最终都会保存到该队列里面
当然,虽然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事件的更详细的分析我们会放在下一章进行讲解。
老李推荐:第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览的更多相关文章
- 老李推荐:第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览
老李推荐:第4章3节<MonkeyRunner源码剖析>ADB协议及服务: ADB协议概览 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试, ...
- 老李推荐:第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览 1
老李推荐:第4章1节<MonkeyRunner源码剖析>ADB协议及服务: ADB协议概览 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试, ...
- 第4章1节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览OVERVIEW.TXT翻译参考(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...
- 第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 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是国内唯一一家培养测试开发工程师的培训机 ...
随机推荐
- java初级开发程序员(第六单元)
1.for循环结构: 循环结构分为四个部分. >初始部分:设置循环的初始状态,如设置记录循环次数的变量i为0. >循环体:重复执行的代码,即输出“好好学习,天天向上!”. >迭代部分 ...
- 在IntelliJ IDEA 13中配置OpenCV的Java开发环境
准备工作: 下载IDEA 13(这里以版本13为例,后面简称IDEA): 下载Java JDK(用于配置基本的Java开发环境): 下载OpenCV 2.4.9(这里以版本2.4.9为例,据这篇文章说 ...
- Android N特性解析
作者:Redyan, 腾讯移动客户端开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/288.html ...
- ios常用资源网址链接
M了个J博客 http://www.cnblogs.com/mjios/tag/objective-c/ Cocoa China http://www.cocoachina.com git网 ht ...
- 无需Get更多技能,快速打造一个可持久化的任务调度
项目总是很忙,忙里偷闲还是要总结一下,前一段时间,由于项目中需要,我们需要很多定时汇总数据的情况,项目初期主要使用sql server 计划任务实现对数据的汇总与统计,但是开发到一定时间内,需求提出了 ...
- 关于synchronized、wait、notify已经notifyAll的使用
前言:关于synchronized.wait.notify已经notifyAll大家应该不陌生,现在我大致说一下我的理解. 一:synchronized synchronized中文解释是同步,那么什 ...
- 轻松理解python中的闭包和装饰器(上)
继面向对象编程之后函数式编程逐渐火起来了,在python中也同样支持函数式编程,我们平时使用的map, reduce, filter等都是函数式编程的例子.在函数式编程中,函数也作为一个变量存在,对应 ...
- 【转】JDBC连接数据库
创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的 ...
- 不要怂,就是GAN (生成式对抗网络) (六):Wasserstein GAN(WGAN) TensorFlow 代码
先来梳理一下我们之前所写的代码,原始的生成对抗网络,所要优化的目标函数为: 此目标函数可以分为两部分来看: ①固定生成器 G,优化判别器 D, 则上式可以写成如下形式: 可以转化为最小化形式: 我们编 ...
- mfc---手动给toolbar按钮添加消息View中
手动给toolbar按钮添加消息View中: .h: afx_msg void OnButtonBG(); .cpp: ON_COMMAND(ID_BUTTON_BG,OnButtonBG) .cpp ...