AMS系列①—AMS的启动

本文是AMS启动分析的第一部分,从SystemServer.main()开始,详细讲解了AMS如何由SystemServer进程创建SystemContext,启动引导服务,特别是AMS的实例化过程。内容包括SystemServer的main()方法、ContextImpl的创建、AMS的构造方法及关键步骤,如创建工作线程、初始化服务等。
摘要由CSDN通过智能技术生成

AMS作为Android FrameWork中最核心的一个部分,是应用层开发者进阶的里程碑,本文是AMS专栏的第一篇文章,介绍AMS的启动相关:

在学习AMS之前,需要掌握一些基础知识:

在学习完上面的内容后,我们可以知道AMS的启动是由SystemServer进程发起的:

SystemServer.main()

AMS的入口方法SystemServer的main()做了两件事:

  • 调用CreateSystemContext()创建SystemContext
  • 开启三类服务:引导服务,核心服务,其他服务
SystemServer.createSystemContext():
    private void createSystemContext() {
   
        ActivityThread activityThread = ActivityThread.systemMain();
    }
ActivityThread.systemMain():
    public static ActivityThread systemMain() {
   
        ActivityThread thread = new ActivityThread();
        thread.attach(true, 0);
        return thread;
    }

在SystemMain中,首先创建了一个SystemServer进程的ActivityThread,没错,这就是用户进程的入口main的那个ActivityThread,所以从某种意义上讲,我们也可以将SystemServer进程看成一个App;

调用了ActivityThread的attach(),注意,这里传入的是true,而我们正常的App传入的是false,这个字段表示是否是系统进程(SystemServer进程):

ActivityThread.attach():
    private void attach(boolean system, long startSeq) {
   
...
        if (!system) {
       //  如果是正常App进程,传入false
...
            final IActivityManager mgr = ActivityManager.getService();
            try {
   
                mgr.attachApplication(mAppThread, startSeq);
            } 
...
        } else {
      //  如果是SystemServer进程,传入true
...
            try {
   
                mInstrumentation = new Instrumentation();
                mInstrumentation.basicInit(this);
                ContextImpl context = ContextImpl.createAppContext(
                        this, getSystemContext().mPackageInfo);
                mInitialApplication = context.mPackageInfo.makeApplication(true, null);
                mInitialApplication.onCreate();
            } 
        }
    }

如果是正常的APP,那么进入if逻辑,调用AMS的代理发起一次Binder消息,实际调用AMS的attachApplication();
在本次情况中是由SystemServer进程发起的,进入else逻辑:

  • 调用ContextImpl.createAppContext()创建App Context
  • 注意上一个方法,传入了一个getSystemContext().mPackageInfo参数
  • 调用makeApplication创建Application

我们先来看传入的参数:

ActivityThread.getSystemContext()
    public ContextImpl getSystemContext() {
   
        synchronized (this) {
   
                mSystemContext = ContextImpl.createSystemContext(this);
    }

getSystemContext()调用了ContextImpl的createSystemContext():

ContextImpl.createSystemContext():

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值