美文网首页
Android系统启动过程

Android系统启动过程

作者: 码农朱同学 | 来源:发表于2018-06-09 14:38 被阅读0次

    第一个系统进程(init)

    作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。

    1.init简介

    init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。本文将基于Android7.0源码来分析Init进程。

    2.引入init进程

    说到init进程,首先要提到Android系统启动流程的前几步:
    1.启动电源以及系统启动
    当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。
    2.引导程序Bootloader
    引导程序是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
    3.linux内核启动
    内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。

    总结起来init进程主要做了三件事:
    1.创建一些文件夹并挂载设备
    2.初始化和启动属性服务
    3.解析init.rc配置文件并启动zygote进程

    解析Zygote进程启动过程

    1.Zygote简介

    在Android系统中,DVM(Dalvik虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fock(复制进程)的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动时会创建DVM,因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM的实例拷贝。
    关于init启动zygote我们在上一篇文章已经提到了,这里就不赘述了,这篇文章主要分析Android7.0 Zygote的启动流程。

    2.AppRuntime分析

    我们从上篇文章得知init启动zygote时主要是调用app_main.cpp的main函数中的AppRuntime的start来启动zygote进程的,我们就从app_main.cpp的main函数开始分析,如下所示。
    frameworks/base/cmds/app_process/app_main.cpp

    Zygote启动流程就讲到这,Zygote进程共做了如下几件事:
    1.创建AppRuntime并调用其start方法,启动Zygote进程。
    2.创建DVM并为DVM注册JNI.
    3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
    4.通过registerZygoteSocket函数创建服务端Socket,并通过runSelectLoop函数等待ActivityManagerService的请求来创建新的应用程序进程。
    5.启动SystemServer进程。

    解析SyetemServer进程启动过程

    1.Zygote启动SyetemServer进程
    在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示。
    frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    2.SyetemServer进程启动过程

    SyetemServer进程是复制了Zygote进程的地址空间,因此也会得到Zygote进程创建的Socket,这个Socket对于SyetemServer进程没有用处,因此,需要注释1处的代码来关闭该Socket。

    启动Binder线程池
    接着我们来查看nativeZygoteInit函数对用的JNI文件,如下所示。
    frameworks/base/core/jni/AndroidRuntime.cpp

    总结SyetemServer进程
    SyetemServer在启动时做了如下工作:
    1.启动Binder线程池,这样就可以与其他进程进行通信。
    2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。
    3.启动各种系统服务。

    Launcher启动过程与系统启动流

    上面我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,接下来我们就来学习Android系统启动流程的最后一步:Launcher的启动流程

    1.Launcher概述

    Android系统启动的最后一步是启动一个Home应用程序,这个应用程序用来显示系统中已经安装的应用程序,这个Home应用程序就叫做Launcher。应用程序Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。

    2.Launcher启动流程

    SyetemServer进程在启动的过程中会启动PackageManagerService,PackageManagerService启动后会将系统中的应用程序安装完成。在此前已经启动的ActivityManagerService会将Launcher启动起来。
    启动Launcher的入口为ActivityManagerService的systemReady函数,如下所示。
    frameworks/base/services/java/com/android/server/SystemServer.java

    Android系统启动流程
    那么结合本篇以及本系列的前三篇文章,我们就可以得出Android系统启动流程,如下所示。
    1.启动电源以及系统启动
    当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。
    2.引导程序BootLoader
    引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
    3.Linux内核启动
    内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,它首先在系统文件中寻找init.rc文件,并启动init进程。
    4.init进程启动
    初始化和启动属性服务,并且启动Zygote进程。
    5.Zygote进程启动
    创建JavaVM并为JavaVM注册JNI,创建服务端Socket,启动SystemServer进程。
    6.SystemServer进程启动
    启动Binder线程池和SystemServiceManager,并且启动各种系统服务。
    7.Launcher启动
    被SystemServer进程启动的ActivityManagerService会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。

    相关文章

      网友评论

          本文标题:Android系统启动过程

          本文链接:https://www.haomeiwen.com/subject/zdmteftx.html