Android之Monkey源码分析(第七篇:Monkey程序如何获知App崩溃,然后自己停止运行的逻辑分析)

前言

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值