Android系统启动过程分析

一概述

(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启动时序图.png

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进程分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容