您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页Android系统启动过程分析

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

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务