1. init进程启动过程
init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动流程中的一个关键的步骤,作为第一个进程,它创建Zygote和属性服务等。
1.1 引入init进程
1.1.1 启动电源以及系统启动
当电源按下时引导芯片代码从预定的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM中,然后执行
1.1.2 引导程序BootLoader
引导程序BootLoader是在Android操作系统开始运行发的一个小程序,它的主要作用是把系统OS拉起来并运行
1.1.3 Linux内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设置后,它首先在系统文件中寻找init.rc文件,并启动init进程
1.1.4 init进程启动
init进程主要是用来初始化和启动属性服务,也用来启动Zygote进程。在init的方法里创建和挂载启动所需的文件目录,其中挂载了tmpfs、devpts、proc、sysfs和sellinuxfs共5种文件系统,以及对属性服务进行初始化
1.1.5总结:
按下启动电源时,系统启动后会加载引导程序,引导程序又启动Linux内核,在Linux内核加载完成后,第一件事情就是要启动init进程。
1.2 init进程启动总结
init进程启动做了很多工作,总的来说主要做了以下三件事:
(1)创建和挂载启动所需的文件目录
(2)初始化和启动属性服务
(3)解析init.rc配置文件并启动Zygote进程
2.Zygote进程启动过程
init启动Zygote时主要是调用 app_main.cpp的main函数中的AppRuntime的start方法来启动Zygote进程的
init -> app_main.cpp(运行main方法) ->AndroidRuntime(运行start方法,方法里包括startVm(启动虚拟机),startReg(为java虚拟机注册JNI方法))->ZygoteInit(通过反射调用 ZygoteInit的main,ZygoteInit是java类)
解析:app_main.cpp 进入这个类的main方法,在此方法里调用了AndroidRuntime的start方法
AndroidRuntime.cpp 这个类里执行了startVm去启动虚拟机,执行startReg方法去为java虚拟注册JNI方法,再通过反射,把ZygoteInit.java的main方法调起来,至此,Zygote便进入了java框架层,此前是没有任何代码进入java框架层的
ZygoteInit.java 的main方法主要做了以下4件事:
(1) 创建一个Server端的Socket.用于等待ActivityManagerService请求Zytote来创建新的应用程序进程
(2) 预加载类和资源
(3)启动SystemServer进程 (系统的服务也会由SystemServer进程启动起来)
(4)等等AMS请求创建新的应用程序进程