Android系统启动流程概述

Android系统启动流程图:
Android系统启动流程概述_第1张图片
Android系统启动流程:Loader->Kernel->Native->C++ Framework->Java Framework->App

一、Loader层
Boot ROM:电源按下开始,固化在ROM中的引导芯片代码开始从预设的地方执行,加载BootLoader到RAM,然后执行(这一步由“芯片厂商”负责设计和实现)。

二、Boot Loader层
启动Android系统之前的引导程序,分三个阶段执行:
第一个阶段,检测外部的RAM以及加载对第二阶段有用的程序;
第二个阶段,设置网络、内存、串口、时钟等等;
第三个阶段,加载Linux内核镜像。(内核镜像被加载到内存,首先进行自解压,zImage, bzImage或uImage的头部都内嵌有解压缩程序,最终将内核解压到内存的指定位置,开始运行内核)。

这些对于运行内核是必要的,为了达到特殊的目标,bootloader可以根据配置参数或者输入数据设置内核。
bootloader程序可以在/bootable找到。

三、Kernel
Kernel层指的就是Android内核层,这里一般开机刚刚结束进入Android系统,Kernel层的启动流程如下:
启动swapper进程(pid=0),这是系统初始化过程kernel创建的第一个进程,用于初始化进程管理、内存管理、加载Display、Camera、Binder等驱动相关工作。
启动kthreadd进程,这是Linux系统的内核进程,会创建内核工作线程kworkder、软中断线程ksoftirqd和thermal等内核守护进程。kthreadd是所有内核进程的鼻祖。
kernel开始启动时,设置缓存、被保护存储器、计划列表,加载驱动。
当kernel完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。

四、Init进程启动
初始化和启动属性服务,并且启动Zygote进程。
init进程是系统空间内的第一个进程,进行初始化和启动属性服务,在main方法中进行,包括初始化资源文件和启动一系列的属性服务。通过执行init.rc文件的脚本文件来启动Zygote进程。

init进程归纳如下:
1.解析init.rc和init.*.rc。
2.挂载文件系统,建立文件夹和文件,设置权限,为一些文件写入初值。
3.初始化property属性。
4.启动系统守护进程如adbd, vold, rild等。
5.启动zygote进程。

五、Zygote进程启动
创建java虚拟机并为java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。

所有的应用程序包括system系统进程 都是zygote进程负责创建,因此zygote进程也被称为进程孵化器,它创建进程是通过复制自身来创建应用进程,它在启动过程中会在内部创建一个虚拟机实例,所以通过复制zygote进程而得到的应用进程和系统服务进程都可以快速地在内部的获得一个虚拟机实例拷贝。

创建JVM并注册JNI,创建服务端的socket,通过socket通信,启动systemServer:
1.创建AppRuntime并调用其start方法,启动Zygote进程。
2.创建JavaVM并为JavaVM注册JNI。
3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
4.通过registerZygoteSocket函数创建服务端Socket,并通过runSelectLoop函数等待ActivityManagerService的请求。
5.启动SystemServer进程。

六、SystemServer进程启动
启动Binder线程池和SystemServiceManager,并且启动各种系统服务。
SystemServiceManager主要是对系统服务进行创建、启动和生命周期管理,就会启动各种系统服务。

七、Launcher启动
被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。
Launcher组件是由之前启动的systemServer所启动的ActivityManagerService启动。

这也是andorid系统启动的最后一步,launcher是andorid系统home程序,主要是用来显示系统中已安装的应用程序。 launcher应用程序的启动会通过请求packageManagerService返回系统中已经安装的应用信息,并将这些应用信息通过封装处理成快捷列表显示在系统屏幕上,这样咱们就可以单击启动它们。

你可能感兴趣的:(Android系统,android)