Android 启动流程

当我们按下手机的电源键到启动完成,Android内部进行了什么操作?

6个步骤

大体来说,Android启动过程共经历了6个步骤:

更详细的流程图:

1. Boot ROM

当按下电源键并且系统开始启动时,Boot ROM 包含通电后cpu执行的第一句代码, 从一个预先定义的位置(固化在ROM中的)开始执行代码,将 BootLoader 加载到RAM中,开始执行。

注: 严格意义上,RAM ≠ 内存,内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。只不过因为RAM是其中最重要的存储器。

2. BootLoader

BootLoader 属于底层代码,它会告诉设备如何找到并启动 System Kernel。

Bootloader是制造商放置锁和限制的地方。

在任何操作系统的启动流程中, BootLoader 都比操作系统先执行.

BootLoader的执行包括两个阶段:

  1. 识别所有的RAM设备,并加载第二阶段会使用到的程序
  2. 配置好所有运行 kernel 所需要的东西,比如网络、内存等等

3. Kernel

一旦 kernel 启动,他便开始配置cache、被保护存储器、计划列表、加载驱动、开启内核后台驻留程序( kernel daemons)、挂载系统根目录、初始化输入输出、开启中断、初始化进程表。

内核是我们设备中的硬件接口中的最底层的可更换的软件

当内核完成系统设置后,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。

4. Init

Init始终是是第一个进程,可以说是所以进程的爷爷(?????? 因为他是Zygote的父亲

这个进程包括两个功能:

  1. 挂载目录,例如 /sys、/dev、或者 /proc
  2. 执行 /init.rc 脚本
    孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;

启动ServiceManager(Binder服务管家)、bootanim(开机动画)等重要服务。
孵化出Zygote进程,Zygote进程是Android系统第一个Java进程(虚拟机进程),Zygote进程是所有Java进程的父进程。

作者:panhaos

链接:https://juejin.im/post/5b7e72bbe51d453894001ef0
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

init进程将设置所有原生服务,这类似于常规Linux系统引导。

注: init.rc 文件并不是普通的配置文件,而是由一种被称为“Android初始化语言”(Android Init Language,这里简称为AIL)的脚本写成的文件。

init.rc 相关查看:Android init.rc详解

5. Zygote

所有的应用程序进程以及系统服务进程(SystemServer)都是由Zygote进程孕育(fork)出来的,zygote本身是Native应用程序,与驱动内核无关。

  我们知道,Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的(在系统启动脚本system/core/rootdir/init.rc文件中)。

  在Java中,不同的虚拟机实例会为不同的应用分配不同的内存。假如Android应用应该尽可能快地启动,但如果Android系统为每一个应用启动不同的Dalvik虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android系统创造了”Zygote”。Zygote是一个虚拟器进程,预加载以及初始化核心库类,让Dalvik虚拟机共享代码、降低内存占用和启动时间。

注: 很长时间以来,Dalvik虚拟机一直被用户指责为拖慢安卓系统运行速度不如IOS的根源。
2014年6月25日,Android L (5.0) 正式亮相于召开的谷歌I/O大会,Android L 改动幅度较大,谷歌将直接删除Dalvik,代替它的是传闻已久的ART。

6. System Servers

在 Zygote 预加载所有必须的Java类和资源后,便会启动 System Server。

System Server是Android系统的核心,他首先会加载能够提供原生功能的接口的叫做 android_servers 的原生库。

然后原生的init方法将会配置原生服务调用,在启动原生服务启动完成后,会创建 服务进程,该线程将根据必要的启动顺序启动系统中的其余服务。

每个服务都运行在SystemServer中一个独立的虚拟机环境中。

一旦System Services启动完成并且在内存中运行,Android便完成了启动,就会发送一条名为 ACTION_BOOT_COMPLETED 的广播,此时开机自启的应用便可在一个BroadcastReceiver中捕获这条广播,然后启动自己的Activity或者Service。

参考

  1. Android Boot Process
  2. Android启动过程图解.md
  3. Android开机启动Activity或者Service方法

添加新评论

请不要水评论

评论列表