老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1
2015-12-31 16:38
381 查看
老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用
上一节我们描述了monkey的命令处理入口函数run是如何调用optionProcess方法来解析命令行参数的。启动参数主要时去指导Monkey时怎么运行起来的,但Monkey作为MonkeyRunner框架的一部分,更重要的是如何将从MonkeyRunner测试脚本出发的命令转化成事件来注入到系统中以进行测试自动化。如前面所说,run方法除了对启动参数进行解析之外还做了很多其他的事情,比如这一小节需要分析的去建立对系统服务的引用。因为只有获得这些引用之后才能实现对系统的事件注入。当然,run方法中其中有一部分代码是跟MonkeyRunner框架不相干的,所以我们不会花时间去分析它,也免得钻进去后影响大家对monkey作为MonkeyRunner框架的服务的理解。下面我们先看下run方法在processOptions之后调用的下一个关键方法getSystemInterfaces:代码2-5-1 Monkey - runprivate int run(String[] args) { ... if (!processOptions()) { return -1; } ... if (!getSystemInterfaces()) { return -3; } ... }[/code]processOptions方法之后到488行之前的代码所做的去准备monkey测试目标packages和生成随机测试seed这些都跟作为MonkeyRunner的一个服务的monkey没有多大关系的。这些主要是当monkey扮演的是一个独立的随机压力测试工具来进行随机对指定的package进行随机压力测试才有意义。所以这里我们没有必要花篇幅去分析它,这不会影响我们对MonkeyRunner框架的理解。这里需要关注的是488行的getSystemInterfaces的一个调用,这个方法做了一个很重要的事情,就是去获得与Android操作系统交互的3个引用:Activity交互控制服务ActivityManagerService
应用包管理服务PackageManagerService
窗口管理服务WindowManagerService。
这些引用在Monkey作为一个MonkeyRunner一个服务运行的时候重要性已经没有在老版本中那么明显了。以往系统注入按键事件为例,我们现在分析的安卓4.4.2版本中,Monkey服务是用InputManagerService服务来注入事件以触发按键等动作的。但是在比较老的版本中,往窗口注入事件主要是通过WindowManagerService服务来完成的,等会我们会给出两个不同版本的按键事件注入源码来印证这个转变。以下我们先描述下这几个服务的作用以及获取的方式:ActivityManagerService: 按照官方的解析,这个类的作用主要是用来为与系统中所有的正在运行的Activity进行交互提供交互接口,主要是围绕着运行中的进程信息,任务信息,服务信息等。但在Monkey中主要是在当monkey作为随机压力测试工具的时候用到。该服务的引用可以通过”ActivityManagerNative.getDefault()”方法获得
PackageManagerService:按照官方的解析,它的作用主要就是用来获取系统已经安装的包的不同的信息。也就是说它主要是用来管理应用程序包的。 同样,它也是在当monkey作为随机压力测试工具才会用到,作为MonkeyRunner服务的时候并不会用到。该服务的引用可以通过AIDL机制来获得。
WindowManagerService: WindowManagerService主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。在稍微老点的Android版本中,Monkey主要是用它直接来注入窗口事件的,在Android 4.1之后才引入InputManagerService服务来处理相应的事件注入请求。该服务的引用可以通过AIDL机制来获得。其实InputManagerServce并不是说最近的版本才有的,之前就一直存在,只不过之前它是作为WindowManagerService的一个服务类存在。而自从安卓4.1版本后它就独立出来作为一个服务运行而已。
InputManagerService: 主要负责的就是用户从键盘,屏幕等进行操作的管理。WindowManagerService是整个窗口的大管家,而InputManagerService在监控接收到用户出发的相应的输入事件后最终是会调用WindowManagerService服务来进行处理的。
下面的安卓架构图显示了这些服务是处在安卓操作系统的什么位置,我相信读者肯定之前已经看过了,但读者请注意该图并没把InputManager服务给画出来,相信是该图并没有及时更新的原因。图5-5-1 安卓架构图
从中我们可以看到整个安卓操作系统从上往下分为多个层次,其中最上层就是应用程,比如我们电话本,浏览器之类的应用就运行在这一层。支撑这些应用运行的背后是一些列的服务和系统,应用层下一层的应用程序框架层就是专门提供这种服务的,比如我们这里提供Activity管理服务的ActivityManagerService,提供窗口和控件管理服务的WindowManagerService,提供应用包管理服务的PackageManagerService,以及提供用户输入管理的InputManagerService都是运行在这一层的。前面3个服务虽然有些已经不会用到,但是由于历史的原因,为了保持调用的一致性,有些接口还是需要传入相应的变量到相应的方法里面,虽然该方面并不会用到该服务。比如Monkey服务在需要往系统注入按键事件的时候会调用到
相关文章推荐
- 老李性能测试分享
- 你想不到:咖啡馆里上工具课
- 移动端自动化测试开课了
- 老李分享:什么是好战略
- 性能调优案例分享:Mysql的cpu过高
- 性能测试分享:性能测试工具开发的案例分享(上)
- 性能测试分享:性能测试工具开发的案例分享(下)
- 性能测试培训:批量执行Jmeter脚本之ant调用 2
- 性能测试培训:分布式测试之jmeter1
- 老李案例分享:MAT分析应用程序服务出现内存溢出过程1
- 老李案例分享:MAT分析应用程序服务出现内存溢出过程2
- 老李案例分享:定位JAVA内存溢出 1
- 老李案例分享:定位JAVA内存溢出 2
- 性能测试培训: 建立压力模型
- 老李分享:你知道有哪些持续集成工具
- 老李分享知识:性能测试之TPS和吞吐率
- 老李分享知识:性能测试之吞吐量
- 性能测试培训:分析内训泄露的案例
- 自动化测试培训:qtp脚本获取获取汇率数据
- 性能测试培训:sql server性能测试分析局部变量的性能影响1