开机过程
在大部分有操作系统的智能设备中,系统启动多数都有大致相同的流程:设备通过开机键完成上电,设备内部会去读取存储在固件上的一小段程序,该程序去读内存上的一段只读(read-only)内存,在获取到内存后,开始自我运行完成它自己要做的工作。它最主要的任务就是授权允许其他类类型的存储--硬盘和主存,可以被访问。然后引导启动固件中操作系统部分程序开始加载并运行在主存中。总的来说,大部分个人电脑,智能手机,平板等都是类似的启动过程。
Android 开机过程
Andorid系统启动流程图Android 启动流程分为以下六步:
1.Boot Rom: 这个过程就是我们常常按下开机键开始启动。当按下开机键后,事先存放在ROM固定位置的程序就开始工作,加载bootloader到RAM中开始执行。
2.BootLoader:bootloaders是包含了很多让设备如何启动和找到System Kernel 的指令的底层代码,很多设备制造商可以在这部分做它们自己的定制。bootloader在操作系统之前运行,它执行分两个阶段:
a) 在第一个阶段,它检测外部的RAM,并加载启动第二阶段要执行的程序
b)在第二阶段,bootloader设置网络,内存等为启动kernel做准备。
3.Kernel:一旦kernel启动,它就是开始创建缓存(cache),保护内存(protected memory),系统调度(scheduling),加载驱动,启动kernel守护进程,挂载文件系统,初始化IO(Input/Output),启动中断,初始化进程表。当kernel启动完成系统启动后,它就开始启动系统第一个进程--Init进程。
4.Init:Init进程系统启动后第一个进程,我们可以说它是系统所有进程的始祖。
Init进程有2个责任:
a.挂载系统目录 比如/sys , /dev ,/proc 等
b.运行init.rc 脚本。init.rc是负责kernel之上操作系统的初始化。(init.rc部分在实际开发中,会经常遇到,比如用来启动自己定制的系统服务,脚本等等,在后面文章会有详细介绍)
Init进程进程会启动所有的本地服务(native service),这有点类似linux 系统启动引导程序。
5.Zygote and Dalvik VM:Zygote是一个随系统启动而启动的VM(虚拟机)进程。我们知道Android应用进程是运行在虚拟机上的,当app_process 启动Zygote时,它首先创建Dalvik VM虚拟机并且调用Zygote main()函数。Zygote通过/dev/socket/zygote 接收到启动应用的请求。一旦请求接收到,它就会触发fork()函数去创建进程。
当一个进程fork时,它会给它自己做一个克隆,复制它自己到另一个内存空间。当Zygote 完成这些后,它会创建一个新的虚拟机(Dalvik VM)线程,用来预加载所有APP需要的类和资源,预加载会让进程创建虚拟机(VM)和加载资源非常高效。
它可以让虚拟机之前共享代码来达到大大缩短应用启动时间的目的。
6.SystemServer:在Zygote预加载所有必要的类(Java Classes)和资源后,它就开始启动System Server了。System server是系统服务的核心,在启动System server第一件事就是去加载android_server这个本地库(native library),这个库里提供了与native机制沟通的接口。
然后native init 方法就会启动很多navtive service,在设置启动native service后,它就会创建一个server线程,这个线程会根据启动顺序去启动系统中剩下其他的系统服务。
每个服务都是运行在System server创建的单独的虚拟机线程中的,一旦系统服务全部启动并运行在内存中,Android就完成了它的启动过程。
此时我们熟悉的“ACTION_BOOT_COMPLETED”广播就会被系统发出了。
网友评论