Android内核分析-Android系统启动过程(四)


前言

在第三章,我们分析了SystemServer的启动流程,也概括性的描述了其启动后做了些什么事情,其中最重要的就是启动了很多SystemService,那么这个章节,我们来具体看看SystemServer进程是如何启动ActivityMangerService的。

SystemServer.run()

一、AMS/ATMS的启动前的一些工作

我们再来看下SystemServer的run方法:

public static void main(String[] args) {
   
    new SystemServer().run();
}
 
private void run() {
   
    ...
    //1.初始化 System Context
    createSystemContext(); 
 
    //2.创建 SystemServiceManager 对象,用来启动后面的服务
    mSystemServiceManager = new SystemServiceManager(mSystemContext); 
    mSystemServiceManager.setStartInfo(mRuntimeRestart,
            mRuntimeStartElapsedTime, mRuntimeStartUptime);
    //把SystemServiceManager添加到本地服务的全局注册表中
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    // Prepare the thread pool for init tasks that can be parallelized
    //3.准备SystemServer的线程池
    SystemServerInitThreadPool.get();
    ...
    
    //4.启动服务
    startBootstrapServices();  //启动引导服务
    startCoreServices();       //启动核心服务
    startOtherServices();      //启动其他服务
    ...
}

看到这里可能有的同学有点模糊了,从前几个章节的介绍到现在,出现了SystemServer、ServiceManager、SystemServiceManger、SystemService,这里需要给同学们做个概念上的讲解:

SystemServer:这是一个进程,zygote fork的第一个进程,AMS等SystemService都在该进程运行。
SystemService:系统服务类的抽象基础类,AMS等服务往往都自身或内部类继承于该抽象类。
SystemServiceManger:这是一个创建服务实例,启动服务实例,管理服务实例的生命周期的一个类。
ServiceManager:这个类的主要职责是控制用户访问服务,控制服务是否可以使用这一接口(通过注册时的检查权限),只管理Service,并不负责创建和启动服务实例。

这里有篇博客做了比较详细说明:https://blog.csdn.net/b1480521874/article/details/79422909

好了,概念明确后,我们继续接着分析。

1.初始化 System Context:createSystemContext()

private void createSystemContext() {
   
    ActivityThread activityThread = ActivityThread.systemMain();
    
    //获取system context
    mSystemContext = activityThread.getSystemContext();
    //设置系统主题
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
 
    //获取systemui context
    final Context systemUiContext = activityThread.getSystemUiContext();
    //设置systemUI 主题
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

在该方法中,主要完成了几件事:
1.创建了 ActivityThread
2.在ActivityThread中,初始化了 Instrumentation、System Context、Application
3.设置主题

ActivityThread.java

public static ActivityThread systemMain() {
   
    // The system process on low-memory devices do not get to use hardware
    // accelerated drawing, since this can add too much overhead to the
    // process.
    if (!ActivityManager.isHighEndGfx()) {
   
        ThreadedRenderer.disable(true);
    } else {
   
        ThreadedRenderer.enableForegroundTrimming();
    }
    //获取ActivityThread对象
    ActivityThread thread = new ActivityThread();
    thread.attach(true, 0);
    return thread;
}


private void attach(boolean system, long startSeq) {
   
    mSystemThread = system;
    if (!system) {
   
        //应用进程的处理流程
        ...
    } else {
   
        //系统进程的处理流程,该情况只在SystemServer中处理
        //创建ActivityThread中的重要成员:Instrumentation、 Application 和 Context
        mInstrumentation = new Instrumentation();
        mInstrumentation.basicInit(this);
        
        //创建系统的Context,Context是Android中的一个抽象类,用于维护应用运行环境的全局信息
        //通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等
        ContextImpl context = ContextImpl.createAppContext(
                this, getSystemContext().mPackageInfo);
        
        //调用LoadedApk的makeApplication函数,Application类用于保存应用的全局状态
        mInitialApplication = context.mPackageInfo.makeApplication(true, null);
        mInitialApplication.onCreate();
    }
}

public ContextImpl getSystemContext() {
   
    synchronized (this) {
   
        if (mSystemContext == null) {
   
            //调用ContextImpl的静态函数createSystemContext
            mSystemContext = ContextImpl.createSystemContext(this);
        }
        return mSystemContext;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值