init 进程启动过程
init 进程是 Android 系统中用户空间的第一个进程,进程号为 1 ,是 Android 系统启动 流程中一个关键的步骤,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创 建 Zygote (孵化器)和属性服务等。 init 进程是由多个源文件共同组成的,这些文件位于 源码目录 system/core/init 中。
it 进程
为了讲解 init 进程,首先要了解 Android 系统启动流程的前几步,以引入 init 进程。
- 启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在 ROM)开始执行。加载引导程序 BootLoader 到队M 中,然后执行。 - 引导程序 Bootloader
引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用 是把系统 OS 拉起来并运行。 - Linux 内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设 置后,它首先在系统文件中寻找 init.rc 文件,井启动 init 进程。 - init 进程启动
init 进程做的工作比较多 ,主要用来初始化和启动属性服务,也用来启动 Zygote 进程。
从上面的步骤可以看出, 当我们按下启动电源时,系统启动后会加载引导程序, 引导 程序又启动 Linux 内核,在 Linux 内核加载完成后,第一件事就是要启动 init 进程。关于 Android 系统启动的完整流程会在本章的 2.5 节进行讲解,这一节的任务就是先了解 init 进 程的启动过程。
init 进程的λ口函数
init 的 main 函数做了很多事情,比较复杂,我们只需关注主要的几点就可以了。在开 始的时候创建和挂载启动所需的文件目录,其中挂载了 tmpfs、 devpts、 proc、 sysfs 和 selinuxfs 共 5 种文件系统,这些都是系统运行时目录,顾名思义,只在系统运行时才会存在,系统 停止时会消失。
僵尸进程与危害
在 UNIX几inux 中,父进程使用 fork 创建子进程,在子进程终止之后,如果父进程并 不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了 一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称作僵尸进程。系统 进程表是一项有限资惊,如果系统进程表被僵尸进程耗尽的话,系统就可能无怯创建新的进 程了。
解析 init.re
init.rc 是一个非常重要的配置文件,它是由 Android~)]始化语言(Android Init Language)
解析 Service 类型语句
in it.re 中的 Action 类型语句和 Service 类型语句都有相应的类来进行解析, Action 类 型语句采用 ActionParser 来进行解析, Service 类型语句采用 ServiceParser 来进行解析, 这里因为主要分析 Zygote ,所以只介绍 ServiceParser。 Servic巳Parser 的实现代码在 syst巳m/core/ir Service 类型语句的,会用到两个函数: 一个是 ParseSection,它会解析 Service 的 re 文件, 比如上文讲到的 init.zygote64.rc, ParseSection 函数主要用来搭建 Service 的架子; 另一个是 ParseLineSection,用于解析子项。
init 启动 Zygote
讲完了解析 Service,接下来该讲 init是如何启动 Service 的,在这里主要讲解启动 Zygote 这个 Service。在 Zygote 的启动脚本中,我们可知 Zygote 的 classname 为 main
属性服务
Windows 平台上有一个注册表管理器 , 注册表的内容采用键值对的形式来记录用户、 软件的一些使用信息。即使系统或者软件重启,其还是能够根据之前注册表中的记录,进 行相应的初始化工作。 Android 也提供了一个类似的机制,叫作属性服务。