安卓启动过程
引导过程
在计算中,引导是启动计算机或计算机设备,直到可以使用为止。它可以由硬件(如按钮按下)或软件命令启动。开机后电脑比较笨,只能读取其存储的一部分称为只读存储器。那里存储了一个称为固件的小程序。它进行开机自检,最重要的是,允许访问其他类型的内存,如硬盘和主内存。固件将更大的程序加载到计算机的主存储器中并运行它。在通用计算机中,以及在智能手机、平板电脑中,可选地运行启动管理器。
安卓启动过程
Android Boot Process 包括以下六个步骤:
- Boot ROM:此步骤称为开机和系统启动。这意味着每当我们按下电源按钮时,Boot ROM 代码就会从一个预定义的位置开始执行,该位置是硬连线在 ROM 中的。 Boot ROM 将 BootLoader 加载到 RAM 中并开始执行。
- BootLoader: Bootloaders 是一个低级代码,包含告诉设备如何启动和查找系统内核的指令。引导加载程序是制造商放置锁定和限制的地方。
引导加载程序是在任何操作系统开始运行之前执行的代码。 BootLoader 分两个阶段执行:
a)在第一阶段,它检测外部 RAM 并加载有助于第二阶段的程序。
b)在第二阶段,引导加载程序设置运行内核所需的网络、内存等。 - 内核:一旦内核启动,它就会启动设置缓存、受保护内存、调度、加载驱动程序、启动内核守护进程、挂载根文件系统、初始化输入/输出、启动中断、初始化进程表。内核是与我们设备中的硬件接口的易于更换的软件的最低级别。当内核首先完成系统设置时,它会在系统文件中查找“init”并启动根进程或系统的第一个进程。
- Init: Init 是第一个进程,或者我们可以说它是所有进程的祖父。
Init 进程有两个职责:
- 挂载目录,如 /sys、/dev 或 /proc
- 运行 /init.rc 脚本。 init.rc 负责系统的初始设置。
init 进程将设置所有本机服务,这类似于常规的 Linux 系统引导。
- Zygote 和 Dalvik VM: Zygote 是一个在系统启动时启动的 VM 进程。当 app_process 启动 Zygote 时,它首先创建 Dalvik VM,然后调用 Zygote 的 main() 方法。 Zygote 通过 /dev/socket/zygote 收到启动 App 的请求。一旦发生,它会触发 fork() 调用。
当一个进程是一个分叉时,它会为自己创建一个克隆。它在另一个内存空间中复制自己。这是非常有效的。当 Zygote 发生这种情况时,它会创建一个精确且干净的新 Dalvik VM 作为线程,预加载任何应用程序所需的所有必要类和资源。这使得创建 VM 和加载资源的过程非常有效。
它支持跨 Dalvik VM 的代码共享,这有助于实现最短的启动时间。
- 系统服务器: zygote 预加载所有必要的Java类和资源后,它会启动系统服务器。 System server是Android系统的核心。发生的第一件事是服务器将加载一个名为 android_servers 的本地库,该库为本地功能提供接口。
然后调用将设置本机服务的本机init方法。在设置本机服务后,它会创建服务器线程。该线程将按照必要的启动顺序启动系统中剩余的服务。
每个服务都在 SystemServer 中的一个单独的 Dalvik 线程中运行。
一旦系统服务在内存中启动并运行,Android 就完成了启动过程,此时“ACTION_BOOT_COMPLETED”标准广播动作将触发。