Android 系统启动
Android系统启动流程
-
启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM,然后执行
-
引导程序 BootLoader
引导程序BootLoader 是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行
-
Linux 内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找 init.rc 文件,并启动init进程
-
init 进程启动
初始化和启动属性服务,并启动 Zygote 进程
-
Zygote 进程启动
创建Java虚拟机并为java虚拟机注册 JNI 方法,创建服务器端 Socket,启动 SystemServer 进程
-
SystemServer 进程启动
启动 Binder 线程池和SystemServiceManager,并且启动各种系统服务
-
Launcher 启动
被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上
init 进程启动流程
-
入口函数: system/core/init/init.cpp—>main()函数
关注点:
a. 在开始时创建和挂载启动所需的文件目录,其中挂载tmpfs、devpts、proc、sysfs、selinuxfs共5种系统文件
b. 调用 property_init() 函数对属性服务进行初始化
c. 调用 signal_handler_init() 函数设置子进程信号处理函数(system/core/init/signal_handler.cpp),主要用于防止 init 进程的子进程成为僵尸进程
d. 调用 start_property_service() 函数启动属性服务
e. 调用 parser.ParseConfig("/init.rc") 解析 init.rc 配置文件
f. 调用 restart_processes() 重启死去的进程
僵尸进程与危害:在Linux中,父进程使用 fork 创建子进程,在子进程终止之后,如果父进程并不知道子进程已经终止了,这时子进程虽然已经退出了,但是在系统进程表中还为它保留了一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称为僵尸进程。系统的进程表是一项有限资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程了
-
解析 init.rc
init.rc 是由 Android 初始化语言(Android Init Language)编写的脚本,这种语言主要包含五种类型语句据:Action、Command、Service、Option和Import
Action 类型语句采用 ActionParser 来进行解析
Service 类型语句采用 ServiceParser (system/core/init/service.cpp)来进行解析
-
init 启动 Zygote 服务