老李推荐:第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是国内唯一一家培养测试开发工程师的培训机 ...
随机推荐
- NodeJS 框架一览
Express 当你使用Node.js构建web应用程序时, Express通常被视为事实上的Web服务器.它的哲学(一个可以使用中间件包扩展的简约核心)是大多数Node.js开发者所熟悉的. Koa ...
- 如何修改Window系统下PATH路径以及win8下masm32V11
如何修改Window系统下PATH路径 //其实这个都是临时性的, 退出dos窗口就没有用了,只是做个笔记罢了 C:\Users\Administrator> set path=E ...
- 硅谷创业教父Paul Graham:如何获得创业idea
link:http://kb.cnblogs.com/page/165530/ 英文原文:How to Get Startup Ideas,翻译:Jason Zheng 要想获得创业 idea,请别试 ...
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- Struts2初步接触
使用idea快速搭建Struts2的Maven项目 首先使用intelij idea部署Maven项目 1.jar包引入 pom.xml 我们用的是阿里云 我用的是最新版的Struts2核心 ...
- webpack 引用 jquery + bootstrap 报错解决
webpack 引用 jquery + bootstrap , error : jQuery is not defind 在webpack.dev.conf.js plugins[] 加入 new w ...
- Java程序通过代理访问网络
问题背景 最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录.爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开 ...
- R语言入门(二)基础语法
1.help可以提供帮助,如help(nchar), help("[["),或者用?nchar也能获取帮助.example(nchar)可以获取到某个主题的使用方法. 2.ncha ...
- (2)java中的集中关系,is a, has a, 继承,重点聊聊继承
java中常见的类关系(javacore上面也有介绍道的) 1.is a关系() 2.has a 整体与局部的关系 3.继承关系 是现实世界中存在而上面两种关系又无法描述的 当然谈的最多的是继承关系, ...
- Android开发之AChartEngine的使用
下面附上代码加注解 package com.example.com.my_achartnegine; import android.content.Context; import android.gr ...