init进程是Android中用户空间的第一个进程,进程号为1。该进程会创建Zygote和属性服务等。
init是由多个源文件共同组成的,源码位于system/core/init中。
init启动流程:
- 按下电源键引导芯片代码从预定义的地方开始执行。加载引导程序BootLoader到RAM中,并执行。
- BootLoader是Andorid中第一个运行小程序,作用是把系统OS拉起并运行。
- 当系统OS运行,内核就会启动,设置缓存,被保护储存器,计划列表,加载驱动。完成系统设置后,在系统文件中寻找init.rc文件,并启动init进程。init进程的入口函数为main函数。
- init进程开始初始化和启动属性服务,启动Zygote进程。
main函数做很多事情,创建和挂载启动所需的文件目录,其中有tmpfs,devpts,proc,sysif和selinexfs,这些都是系统运行时目录。
main函数中会对属性进行初始化并启动属性服务。
main函数会设置子进程信号处理函数,防止init进程的子进程成为僵尸进程。加入子进程Zygote终止了,会移除所有Zygote进程的信息,重启Zygote服务的启动脚本中带有onrestart选项的服务。
Android中的属性服务就类似于Windows平台上的注册表管理器,会用键值对形式记录用户和软件的一些使用信息。当系统重启后还是能够找到注册表中的信息,进行相应的初始化工作。init进程启动时会启动属性服务,并为其分配内存,用来储存这些属性。
属性服务会处理客户端的请求,系统属性分为两个类型,一个是普通属性,一个是控制属性。控制属性用来执行一些命令,例如开机动画。
总结init进程启动:
- 创建和挂载启动所需的文件目录
- 初始化和启动属性服务
- 解析init.rc配置文件并启动Zygote进程