Android整体启动流程

Android启动流程图

1.Boot Rom(引导ROM)
当长按开机键的时候,引导芯片开始从固化在ROM的预设代码开始执行。然后加载引导程序到RAM。 

问题1:Boot ROM是谁加载引导程序的?

是通过引导芯片加载ROM预设代码。预设代码固化在ROM中。

问题2:引导程序是什么?

引导程序是BootLoader。引导程序在操作系统运行之前执行。

2.BootLoader

BootLoader,又称为引导程序。它是在操作系统运行之前运行的一段程序,是运行的第一个程序。主要有检查RAM,初始化硬件参数等功能,当然它的最终目的是把操作系统给拉起来

其实Bootloader主要的必须的作用只有一个:就是把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行,我们称之为启动加载模式,该过程没有用户的介入,是它正常工作的模式。

他的步骤:

Stage1:

1.硬件设备初始化。为stage2的执行及随后内核的执行准备好基本的硬件环境

2.为加载stage2 准备ram空间。为了获得更好的执行速度,通常吧stage2加载到ram中执行

3.复制stage2的代码到ram中

4.设置好堆栈

5.跳转到stage2的c程序入口

Stage2:

1.初始化本阶段要使用的硬件设备

2.检测系统内存映射

3.将内核映像和根文件系统映像从flash读到ram中

4.为内核设置启动参数

5.调用内核

问题3:引导程序的功能是什么?

把操作系统拉起来。主要功能包括检查RAM,初始化硬件参数等。

3.内核初始化(Kernal初始化 内核层)

入口的函数是start_kernel函数start_kernel 函数完成了内核的大部分初始化工作。实际上,可以将start_kernel 函数看做内核的main函数。start_kernel函数执行到最后调用了reset_init函数进行后续的初始化。 reset_init函数最主要的任务就是启动内核线程kernel_initkernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程。到init_post函数为止,内核的初始化已经基本完成。

问题4:驱动程序初始化是什么过程完成的?

内核初始化。

步骤4.init进程(Framework Native)

当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的。init进程负责创建系统中最关键的几个子进程,尤其是zygote。另外,它还提供了property service(属性服务),类似于windows系统的注册表服务。

在Android系统中,会有个init.rc脚本。init进程一启动就会读取并解析这个脚本文件,把其中的元素整理成自己的数据结构(链表)。

问题5:Sysm_manager是谁创建的?

Sysm_manager是Framework一个重要的服务进程,是由i孵化器进程创建的。

步骤5:孵化器进程(Zygote进程 Native与Java桥接)

Zygote进程,这个进程是所有Java进程的父进程。

我们知道,Linux是基于C的,而Android是基于Java的(当然底层也是C)。所以这里就会fork出一个Zygote Java进程用来fork出其他的进程。在zygote开启的时候,会调用ZygoteInit.main()进行初始化。

问题6:桌面启动一个应用,这个进程是谁创建的?

孵化器进程。

步骤6:SystemServer进程

前面ZygoteInit.java里面通过startSystemServer()fork出了SystemServer进程,这个进程在整个的Android中非常重要,它和Zygote进程 一样,SystemServer进程是Android Framework层的两大重要进程。系统里面重要的服务都是在这个进程里面开启的,例如AMS, WindowsManager, PackageManagerService等等都是由这个SystemServerfork出来的。

public final class SystemServer {


    // The main entry point from zygote.
    public static void main(String[] args) {
        new SystemServer().run();
    }

    public SystemServer() {
        // Check for factory test mode.
        mFactoryTestMode = FactoryTest.getMode();
    }

    private void run() {

......

        // 初始化原生服务库
        System.loadLibrary("android_servers");
        nativeInit();

        // 初始化系统上下文
        createSystemContext();

        // 创建SystemServiceManager对象
        mSystemServiceManager = new SystemServiceManager(mSystemContext);

        // 开启服务
        try {
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        }
        
        ......

        // Loop forever.
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

    //初始化系统上下文对象mSystemContext,并设置默认的主题。
    private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
    }

    //在这里开启了几个核心的服务,因为这些服务之间相互依赖,所以都放在了这个方法里面。
    private void startBootstrapServices() {
    
......
    
        //初始化ActivityManagerService
        mActivityManagerService = mSystemServiceManager
              .startService(ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);

        //初始化PowerManagerService,因为其他服务需要依赖这个Service,因此需要尽快的初始化
        mPowerManagerService = mSystemServiceManager
              .startService(PowerManagerService.class);

        // 现在电源管理已经开启,ActivityManagerService负责电源管理功能
        mActivityManagerService.initPowerManagement();

        // 开启DisplayManagerService
        mDisplayManagerService = mSystemServiceManager
              .startService(DisplayManagerService.class);

        // 开启PackageManagerService
        mPackageManagerService = PackageManagerService.main(mSystemContext,mInstaller,
              mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);

......
    }

    private void startCoreServices() {...}// 启动一些基本服务。
    
    private void startOtherServices() {...}// 启动其他服务。
}

步骤7:Home Activity(启动APP)

上面ActivityManagerService 开启之后,会调用finishBooting() ,完成引导过程。同时发送开机广播“ACTION_BOOT_COMPLETED” 。

之后就会开启系统的主程序——Launcher程序,完成系统界面的加载与显示。

至此,Android的开机启动流程大概就完成了。

问题7:Android开机启动动画是在那个步骤执行的?

init进程会根据init.rc配置启动surfaceflinger进程,显示开机动画。

参考文献:

1.Android的开机启动流程概述 - 简书

猜你喜欢

转载自blog.csdn.net/joedan0104/article/details/121941024
今日推荐