目录
第2章名为 Android 系统启动,共有六个小节的内容:
- 1、init进程启动过程
- 2、Zygote进程启动过程
- 3、SystemServer处理过程
- 4、Launcher启动过程
- 5、Android系统启动流程
- 6、本章小节
2.1、init 进程启动过程
init 进程是 Android 系统中用户空间的第一个进程,进程号为 1 ,是 Android 系统启动流程中一个关键的步骤,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建 Zygote (孵化器)和属性服务等。 init 进程是由多个源文件共同组成的,这些文件位于源码目录 system/core/init 中。
2.1.1、引入init 进程
为了讲解 init 进程,首先要了解 Android 系统启动流程的前几步,以引入 init 进程。
1、启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在 ROM)开始执行。加载引导程序BootLoader 到RAM 中,然后执行。
2、引导程序 Bootloader
引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来并运行。
3、Linux 内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设置后,它首先在系统文件中寻找 init.rc 文件,井启动 init 进程。
4、init 进程启动
init 进程做的工作比较多 ,主要用来初始化和启动属性服务,也用来启动 Zygote 进程。
从上面的步骤可以看出, 当我们按下启动电源时,系统启动后会加载引导程序, 引导程序又启动 Linux 内核,在 Linux 内核加载完成后,第一件事就是要启动 init 进程。
2.1.7、init进程启动总结
init 进程启动做了很多的工作,总的来说主要做了以下三件事:
- 创建和挂载启动所需的文件目 录。
- 初始化和启动属性服务。
- 解析 init.rc 配置文件并启动 Zygote 进程。
2.2、Zygote进程启动过程
在 上一小节节中我们学习了 init 进程启动过程,在启动过程中主要做了三件事,其中一件就是创建了 Zygote 进程,本节接着学习 Zygote 进程启动过程, 首先我们要了解 Zygote 是什么。
2.2.1、Zygote概述
在 Android 系统中, DVM (Dalvik 虚拟机)和 ART 、 应用程序进程以及运行系统的关键服务的 SystemServer 进程都是由 Zygote 进程来创建的,我们也将它称为孵化器。
2.2.4、Zygote进程启动总结
Zygote 进程启动共做了如下几件事 :
- 创建 AppRuntime 并调用其 start 方法,启动 Zygote 进程。
- 创建 Java 虚拟机并为 Java 虚拟机注册 JNI 方法 。
- 通过JNI调用 Zygotelnit 的 main 函数进入 Zygote 的 Java 框架层。
- 通过 registerZygoteSocket 方法创建服务器端 Socket ,并通过 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程。
- 启动 SystemServer 进程。
2.3、SystemServer 处理过程
SystemServer 进程主要用于创建系统服务,我们熟知的 AMS 、 WMS 和 PMS 都是由它来创建的。
2.3.3、SystemServer 进程总结
SystemServer 进程被创建后,主要做了如下工作:
- 1 启动 Binder 线程池,这样就可以与其他进程进行通信 。
- 2 创建 SystemServiceManager ,其用于对系统的服务进行创建、启动和生命周期管理。
- 3 启动各种系统服务。
2.4、Launcher 启动过程
此前已经学习了 Android 系统启动流程的 init 进程、 Zygote 进程和 SystemServer 进程,最后我们来学习 Launcher 的启动过程。
2.4.1、Launcher 概述
系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序,这个应用程序就叫作 Launcher 。Launcher 在启动过程中会请求 PackageManagerService 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。
通俗来讲 Launcher 就是 Andro id 系统的桌面,它的作用主要有以下两点:
- (1)作为 Android 系统的启动器,用于启动应用程序 。
- (2)作为 Android 系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件。
2.5、Android 系统启动流程
结合本章前 4 节的内容,我们可以清晰地总结出 Android 系统启动流程,这个流程主要有以下几个部分。
1、启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在 ROM )开始执行。加载引导程序BootLoader 到 RAM ,然后执行。
2、引导程序 Bootloader
引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来并运行。
3、Linux 内核启动
当内核启动时 ,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找 init.rc 文件,并启动 init 进程 。
4、init 进程启动
初始化和启动属性服务,井且启动 Zygote 进程。
5、Zygote 进程启动
创 建 Java 虚拟机井为 Java 虚拟机注册 JNI 方告,创建服务器端 Socket ,启动SystemServer 进程。
6、SystemServer 进程启动
启动 B inder 线程池和 SystemServiceManager,并且启动各种系统服务。
7、Launcher 启动
被 SystemServer 进程启动的 AMS 会启动 Launcher, Launcher 启动后会将己安装应用的快捷图标显示到界面上。
结合上面的流程,给出 Android 系统启动流程图 ,如图 2-4 所示 。
2.6、本章小节
为了更好地理解 Android 系统启动流程,本章中我们先后学习了 init 进程启动过程、Zygote 进程启动过程、 SystemServer 进程处理过程和 Launcher 启动过程,这些进程的启动过程其实细节很多也很复杂, 而本章更注重流程 ,因此并不会对每一个细节进行深挖,如果想要深拉就需要读者自行阅读源码。另外,本章所讲到的知识会和后面章节有所关联,是全书的基础章节。