Android启动之SystemServer和Launcher

SystemServer

上一篇中我们讲到Zygote进程启动了SystemServer进程,那么来看看它是如何处理System进程的。先来一个完整的时序图,如下:

在这里插入图片描述

在ZygoteInit.java的forkSystemServer方法fork了SystemServer的子进程并启动,然后执行了handleSystemServerProcess方法,在这里最终会执行zygoteInit函数来进行初始化,这个函数如下:

    public static final void zygoteInit(int targetSdkVersion, String[] argv,
            ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
        ... 
 
        RuntimeInit.redirectLogStreams(); 
 
        RuntimeInit.commonInit(); 
        ZygoteInit.nativeZygoteInit(); 
        RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
    }

倒数第二行代码调用了nativeZygoteInit方法,这是一个Native层的函数,用来启动Binder线程池,这样SystemServer进程就可以使用Binder与其他进程进行通信。

最后一行代码则通过RuntimeInit的applicationInit方法来进入SystemServer的main方法。

下面来具体看一下。

Binder线程池

nativeZygoteInit是一个Native方法,定义在AndroidRuntime.cpp(frameworks/base/core/jni/AndroidRuntime.cpp)文件中:

static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz){
    gCurRuntime->onZygoteInit();
}

这里gCurRuntime是AndroidRuntime类型的指针,实际上是AndroidRuntime的子类AppRuntime,它在app_main.cpp中定义,它的onZygoteInit代码如下:

virtual void onZygoteInit()
{
    sp<ProcessState> proc = ProcessState::self();
    proc->startThreadPool(); 
}

可以看到通过startThreadPool启动了一个Binder线程池,这样SystemServer进程就可以使用Binder与其他进程进行通信。

SystemServer的main方法

回到上面,在启动线程池后执行了RuntimeInit的applicationInit方法,这个方法主要是找到“com.android.server.SystemServer”这个类,并通过反射获取它的main函数并最终执行起来,这部分就不细说了。

SystemServer的main函数如下:

public static void main(String[] args) {
    new SystemServer().run();
}

只有一行,创建了SystemServer并执行run函数,代码如下:

    private void run() {
        ...
        Looper.prepareMainLooper();
 
        System.loadLibrary("android_servers");//1
        performPendingShutdown();
 
        createSystemContext();

        mSystemServiceManager = new SystemServiceManager(mSystemContext);//2
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
 
        try {
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
        } catch (Throwable ex) {
            ...
        }
        ...
        
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

首先通过loadLibrary加载了libandroid_servers.so动态库,然后创建了SystemServiceManager,它会对系统服务进行创建、启动和生命周期管理。

然后在try代码块中通过startBootstrapServices方法启动了ActivityManagerService、PowerManagerService、PackageManagerService等服务;通过startCoreServices方法启动BatteryService、WebviewUpdateService等服务;通过startOtherServices方法启动CameraService、AlermManagerService等服务。这些服务的父类均为SystemService。

从这部分可以看到官方把系统服务分成了三个类型:引导服务、核心服务和其他服务,其他服务中是一个非紧要和不需要立即启动的服务。

在三个方法中会分别创建这些服务并注册到ServiceManager中,ServiceManager用来管理系统中各种Service,用于系统C/S架构的Binder通信机制:Client端要使用某个Service,需先到ServiceManager查询相关信息,根据这些信息与Service所在的Server进程建立通信通路,这样Client端就可以使用Service了。

SystemServer总结

SystemServer进程创建后主要做了如下工作:

  1. 启动Binder线程池,这样就可以与其他进程通信
  2. 创建SystemServiceManager,用于对系统服务进行创建、启动和生命周期管理
  3. 启动各种系统服务

Launcher

SystemServer进程启动过程中会启动PackageManagerService,它启动后会将系统中的应用程序安装完成。在此之前已经启动的AMS会将Launcher启动起来,Launcher启动过程如图:

在这里插入图片描述

启动Launcher的入口是AMS的systemReady方法,它在SystemServer的startOtherServices方法中被调用。Launcher启动后会查询系统中已经安装的应用程序及信息,然后显示到桌面上。

总结

我们通过两篇文章来简单的了解了Android系统的启动流程,这个流程主要有几个部分:

  1. 启动电源和系统启动

    当电源键按下时引导芯片代码从预定义地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM执行。

  2. 引导程序BootLoader

    引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。

  3. Linux内核启动

    当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,首先在系统文件中寻找init.rc文件,并启动init进程。

  4. init进程启动

    初始化和启动属性服务,并启动Zygote进程

  5. Zygote进程启动

    创建java虚拟机并为其注册JNI方法,创建服务器Socket,启动SystemServer进程

  6. SystemServer进程启动

    启动Binder线程池和SystemServiceManager,并启动各种系统服务

  7. Launcher启动

    被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上

以上就是Android系统启动的完整流程,当然很多细节没有讲,大家有兴趣可以自行研究一下。

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题
图片

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值