Android之Monkey源码分析(第六篇:系统服务初始化过程分析)

前言

    自从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,这个重头戏,感觉下篇文章能写好长时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值