老李推荐:第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是国内唯一一家培养测试开发工程师的培训机 ...
随机推荐
- 解决HTML导出Excel表数字变成科学计数法
- js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串转 ...
- vue生命周期的介绍
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 2017-2-23 C#基础 中间变量
用中间变量做这个题 1."请输入年份:"(1-9999) "请输入月份:"(1-12) "请输入日期:"(要判断大小月,判断闰年) 判断输入 ...
- javaweb 打包为安卓apk(1)-Hbuilder
需求:当前已经完成java web项目开发,java web项目前端使用自适应框架(bootstrap),想使用最简单方式生成一个安卓apk,无需进行安卓开发(类似于手机浏览器访问一样) 要求:项目已 ...
- 智能打印SDK-源码剖析
开源地址:http://www.dnnode.com/ 软件下载地址:http://www.dnnode.com/在线展示:http://www.dnnode.com/help.html 前面的文章, ...
- wpf的无边框窗体透明
本人做了3年的winform,来了新的工作,需要使用wpf.对于wpf,本人小白一个.说的不对的地方,请大家多多指导.... 今天先从wpf的窗体属性开始说起! 需要做的项目功能大概和电脑桌面类似,需 ...
- TP框架 基础1
php框架 一.真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格 ...
- Jquery之JSON的用法
今天讲了Jquery里面JSON的用法,下面是今天讲课给的例子: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" &quo ...
- TP框架数据库操作(增删改)
首先选择一张表,对其进行操作: 对数据库操作之前首先要创建模型: $n = M("account"); 数据库添加数据: 1.使用数组: 1.使用数组 $arr = array(& ...
- mybatis基础,mybatis核心配置文件properties元素
peroperties元素 可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递 为dataSource元素配置 <proper ...

