一概述
(1)开机系统启动时,从预定义的地方开始执行代码,加载引导程序BootLoader到ARM,它是Android操作系统开始运行前的程序,负责把系统OS拉起来并运行。
(2)接下来,Linux内核启动,设置缓存、被保护存储器、计划列表,加载驱动,完成初始设置,最后在系统文件中寻找名为init.rc的文件,启动init进程。
二init进程分析
/system/core/init/init.cpp
main函数是该进程的入口函数,它的主要工作是创建和挂载启动所需的目录文件比如:tmpfs、devpts、proc 、sysfs 等系统运行时目录。启动属性服务,设置子进程型号处理函数,用以防止子进程成为僵尸进程(比如子进程由于某种原因,终止运行,而父进程不知,仍然保存子进程状态等信息),启动Zygote进程。
int main(int argc, char** argv){
...//部分代码
Parser& parser = Parser::GetInstance();
parser.AddSectionParser("service",std::make_unique<ServiceParser>());
parser.AddSectionParser("on", std::make_unique<ActionParser>());
parser.AddSectionParser("import", std::make_unique<ImportParser>());
std::string bootscript = GetProperty("ro.boot.init_rc", "");
if (bootscript.empty()) {
parser.ParseConfig("/init.rc");
parser.set_is_system_etc_init_loaded(
parser.ParseConfig("/system/etc/init"));
parser.set_is_vendor_etc_init_loaded(
parser.ParseConfig("/vendor/etc/init"));
parser.set_is_odm_etc_init_loaded(parser.ParseConfig("/odm/etc/init"));
} else {
parser.ParseConfig(bootscript);
parser.set_is_system_etc_init_loaded(true);
parser.set_is_vendor_etc_init_loaded(true);
parser.set_is_odm_etc_init_loaded(true);
}
}
注意:android 8.0中堆init.rc文件进行了拆分,每个服务对应一个rc文件。
Zygote进程启动
在Android系统中,应用进程以及系统服务的SystemServer进程都是由Zygote进程通过fock自身的形式创建(Zygote在启动时会创建DVM或ART,因此拥有它们的实例,fock后的进程可以直接得到这个实例副本)。
Zygote启动主要做了以下5件事:
(1).创建AppRuntime并调用其start方法,启动Zygote进程
(2).创建Java虚拟机,注册JNI
(3).通过JNI调用Zygote的main函数进入Zygote的Java层
(4).调用registerZygoteSocket()创建服务端Socket,通过funSelectLoop等待AMS的请求创建新的应用程序进程
(5).启动SystemServer进程
SystemServer进程非常重要,众所周知的AMS、PMS、WMS等都是它创建,启动的。
请看下一篇文章:SystemServer进程分析