前言
自从Monkey对象创建之后,主流程的run()方法被调用,在run()方法执行过程中,对Monkey对象持有的几个系统服务进行了初始化,没有系统服务的支持,Monkey程序将举步维艰,一起分析一下吧
run()方法回顾
run()方法是Monkey类中的一个实例方法,在它的内部执行了Monkey程序的主要流程,在其中一个步骤中,调用了一个getSystemInterfaces()方法,在此方法中,获取到远程系统服务的引用,从而畅快的使用系统服务完成工作
private int run(String[] args) {
………省略很多源码………
if (!getSystemInterfaces()) {
return -3;
}
………省略很多源码………
}
当getSystemInterfaces()方法的返回值为false时,说明系统服务初始化过程中出错了,整个run()方法会返回一个-3来表示错误码
getSystemInterfaces()方法分析
private boolean getSystemInterfaces() {
mAm = ActivityManager.getService();
if (mAm == null) {
Logger.err.println("** Error: Unable to connect to activity manager; is the system "
+ "running?");
return false;
}
mWm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
if (mWm == null) {
Logger.err.println("** Error: Unable to connect to window manager; is the system "
+ "running?");
return false;
}
mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
if (mPm == null) {
Logger.err.println("** Error: Unable to connect to package manager; is the system "
+ "running?");
return false;
}
try {
mAm.setActivityController(new ActivityController(), true);
mNetworkMonitor.register(mAm);
} catch (RemoteException e) {
Logger.err.println("** Failed talking with activity manager!");
return false;
}
return true;
}
位于Monkey类中,用于初始化获取系统服务的方法
1、获取AMS系统服务的支持
mAm是Monkey对象持有的IActivityManager接口类型的实例变量,它表示AMS系统服务提供的功能,此处ActivityManager的getService()获取到系统服务的引用
2、检查AMS系统服务获取是否成功
如果mAm为null,说明没有获取到AMS系统服务,在标准错误中输出内容,告知系统服务是否启动?此时直接返回false,表示获取系统服务失败!AMS系统服务作为独立线程,位于System Server进程中运行,提供的Binder的引用通过Binder驱动程序,注册在Service Manager进程中
3、获取WMS系统服务的支持
mWm是Monkey对象持有的一个接口类型为IWindowManager的对象,该接口规定了WMS系统服务对外提供的功能
4、检查WMS是否获得
没有获得同样标准错误流中提示,且返回false,表示获取系统服务失败
5、获取PMS系统服务的支持
mPm是Monkey对象持有的一个接口类型为IPackageManager的对象,该接口规定了PMS系统服务提供的功能
6、检查PMS系统服务的获取情况
如果没有获取到PMS系统服务,同样在标准错误流中提示,并且返回false,表示获取系统服务失败!
7、注册ActivityController对象到AMS系统服务中,AMS系统服务可以远程调用ActivityController中的方法(远程方法在Monkey程序的本地Binder线程池中执行)
此处创建的ActivityController对象,位于Monkey类中,作为普通内部类存在,下一篇文章单独分析ActivityController
8、注册网络监听器到AMS系统服务中,mNetMonitor是Monkey对象持有的一个MonkeyNetworkMonitor对象,这个类在单独的文件中定义,还是一个IIntentReciver相关的Binder对象,这个也在后面的文章中单独分析吧
9、上面两个注册行为,一旦出现RemoteException,说明系统服务出错,则也直接返回false,表示系统服务初始化失败
10、没有出错的情况,向调用者返回true,表示系统服务初始化成功
总结
1、Monkey程序依赖3个系统服务的支持,AMS、WMS、PMS
2、Monkey程序注册了一个ActivityController,这个Binder对象特别的重要,是与AMS系统服务交互的桥梁,正是因为它的使用,AMS监控出App、Native进程出现崩溃,才能及时告知Monkey程序,这也是Monkey程序能发现崩溃情况后,第一时间保存现场的关键点!
3、系统服务的初始化非常重要,一旦其中有一个出错,此时的Monkey程序将结束
4、下一篇文章我们将分析ActivityController,这个重头戏,感觉下篇文章能写好长时间