前言
Monkey程序用来执行稳定性测试,当被测App出现Crash、ANR,Monkey程序会第一时刻获知崩溃情况,然后向标准错误中写入堆栈信息,同时自己可能会停止运行,取决于我们传递的命令行参数,你知道Monkey程序如何知道其他App的崩溃的吗?Monkey程序本身又是如何自己停止运行的呢?
今天一起学习ActivityController,你将得到答案……
ActivityController类结构
private class ActivityController extends IActivityController.Stub {
…………省略很多代码…………
}
ActivityController位于Monkey.java类中,是以普通内部类的方式创建的,Monkey程序依赖ActivityController对象与AMS系统服务保持通信,ActivityManagerService通过ActivityController对象提供的API告知Monkey程序,Android系统发生了哪些事情? 这是我们的第一个问题的答案:Monkey程序是被AMS系统服务告知其他App发生的崩溃的。
ActivityController作为跨进程的Binder对象(Android进程间通信标准),提供了哪些服务?这些在ActivityController中实现的方法预先已经在一个称为IActivityController的接口中进行了规范,这些方法表示ActivityController可以提供哪些跨进程的服务
IActivityController是一个接口类,这个接口类的内部又定义了一个静态内部类,它的名字叫做Stub,所以才会有IActivityController.Stub这样的语法
ActivityController的父类IActivityController.Stub位于IActivityController接口类中,作为Binder对象的ActivityController继承了IActivityController.Stub,IActivityController.Stub类又继承了Binder类,而Binder类又继承了IActivityController!
那么IActivityController接口类中规定了哪些方法?(作为服务)即IActivityController规定的Binder服务可以提供哪些跨进程服务的功能呢?
IActivityController规定的方法(对外规定提供的服务)
说明:Android中的Binder标准,让跨进程之间的调用变得轻松,你只管调用,其他交给系统去实现,所以才会有这么方便的回调方法,AMS系统服务是运行在System Server进程中的一个独立线程,它可以方便的回调其他进程的方法,这正是Binder的功劳!牛逼!!
activityStarting() 当通过Intent启动Activity时,AMS系统服务可以跨进程的调用此方法
activityResuming() 当Activity需要恢复时,AMS会跨进程回调此方法
appCrashed() 当任意一个App发生Crash,AMS会跨进程的自动调用此方法
appEarlyNotResponding()当App发生ANR,AMS会跨进程调用此方法
systemNotResponding() 当Android系统没有响应的时候,AMS会跨进程调用此方法
IActivityController接口规定了5个方法,说明该Binder可以提供5个服务。
AMS由于持有IActivityController对应的子类远程Binder对象的引用,所以AMS系统服务在自己的业务逻辑中,加入了跨进程调用的这些方法,以此达成进程间通信。(各个进程之间不再孤立运行,而是间接改变对方进程内存中的数据完成通信,形成更为复杂的业务逻辑),在这里通信的两个进程,一个是Monkey进程、另一个是SystemServer进程,Monkey进程根据SystemServer中的AMS系统服务(线程形式)的告知(回调),用以完成自己的业务逻辑。(大写的牛逼)
两个通信的进程
1、Monkey进程
2、AMS系统服务所在进程(SystemServer进程)
注意:实现了IActivityController接口的Binder对象中的所有方法全部在本地App进程中的Binder线程池中一个线程中运行…………,比如appCrashed()方法,它会运行在Monkey进程所在的Binder线程池中的1个线程中
在Monkey程序中,ActivityController具体实现了一些根据系统情况的业务逻辑,比如系统告知出现App崩溃、出现ANR、出现Native崩溃,Monkey程序怎么做的业务逻辑
在此之前,我们带着几个问题,继续学习……它们是:
1、Monkey程序什么时候向AMS注册的ActivityController对象(Binder对象)?
2、Monkey程序又是什么时候告知AMS终止注册的ActivityController对象(Binder对象)?
3、ActivityContoller中提供的方法又是如何实现自身业务逻辑的?
4、系统出现App崩溃,Monkey程序怎么做的?
5、系统出现Anr,Monkey程序又是怎么做的?
向AMS注册ActivityController对象
private boolean getSystemInterfaces() {
mAm = ActivityManager.getService();
……省略代码……
try {
mAm.setActivityController(new ActivityController(), true);
mNetworkMonitor.register(mAm);
} catch (RemoteException e) {
Logger.err.println("** Failed talking with activity manager!");
return false;
}
……省略代码……
}
Monkey程序在getSystemInterfaces()方法中获取所有需要使用的系统服务,使用Monkey对象持有的表示AMS系统服务的mAm,在ActivityManager对象中,有一个setActivityController()方法用于向AMS系统服务主动注册一个实现IActivityControler接口的Binder对象,即代码中的
mAm.setActivityController(new ActivityController(), true);
setActivityController()方法,传入的第一个参数新创建的ActivityController对象,第二个参数true,则告知AMS

最低0.47元/天 解锁文章
2065

被折叠的 条评论
为什么被折叠?



