老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数
MonkeyRunnerStarter是MonkeyRunner启动时的入口类,因为它里面包含了main方法.它的整个启动过程主要做了以下几件事情:
- 解析用户启动MonkeyRunner时从命令行传输进来的参数: 因为MonkeyRunner需要根据指定的参数才能做事情,比如输入的一个需要执行的脚本。如果确实不知道任何参数的话它就会进入MonkeyRunner的交互模式,其实就是Jythong的交互模式,让用户可以边写代码边执行
- 启动AndroidDebugBridge: 其实就是启动ADB服务器,因为MonkeyRunner跟设备通信的一个很重要的方法之一就是通过向ADB服务器发送命令来请求目标设备的服务
- 启动设备监控线程: 其实这个是在启动AndroidDebugBridge的时候一并启动的。设备监控线程主要做的事情就是取监控设备是否有接入进来或者移除出去,如果有新的设备连接进来,或者说设备变成ONLINE状态(一个设备有多个状态:ONLINE|OFFLINE|RECOVERY|UNAUTHORIZED),那么就需要取监控设备里面的每个可调试进程,这主要是用来给DDMS等调试工具使用的。它维护了一个最新的设备列表
- 启动AndroidDebugBridge:
- 启动Monkey:
- 运行测试脚本:
本小节我们会先去看下MonkeyRunner在启动的时候是如何获得命令行参数并对其进行解析处理的。整个过程其实跟monkey在启动的时候的命令行参数分析类似。往下我们先看下牵涉到的关键类之间的关系:
图8-2-1 MonkeyRunnerStarter类图
从类图中我们看到MonkeyRunnerStarter持有了一个MonkeyRunnerOptions类型的成员变量options,这个实例保存的就是解析出来的命令行参数,同时该类会提供一个processOptions方法来专门解析命令行参数。
我们先进入到MonkeyRunnerStart这个类的main方法:
178 public static void main(String[] args) {
179 MonkeyRunnerOptions options =
MonkeyRunnerOptions.processOptions(args);
180
181 if (options == null) {
182 return;
183 }
184
185
186 replaceAllLogFormatters(MonkeyFormatter.DEFAULT_INSTANCE,
options.getLogLevel());
187
188 MonkeyRunnerStarter runner =
new MonkeyRunnerStarter(options);
189 int error = runner.run();
190
191
192 System.exit(error);
193 }
194 }
代码3-2-1 MonkeyRunnerStart - main
这里主要做了三件事情:
- 179行去处理用户启动monkeyrunner的时候输入的命令行参数
- 188行去初始化MonkeyRunnerStarter,里面主要是初始化了ChimpChat,ChimpChat又去开启AndroidDebugBridge进程和开启DeviceMonitor设备监控线程,我们往后小节会进行详细分析
- 189行去把monkeyrunner运行起来,包括带脚本参数的情况和不待脚本参数直接提供jython命令行的情况