• Android 14 系统启动流程 之 启动init进程、启动Zygote进程


    废话不多说,先上图,不清楚的可以在评论区留言。
    在这里插入图片描述

    启动init

    init 进程入口函数

    kernel/common/init/main.c --> kernel_init

    try_to_run_init_process("/bin/init")   // kernel启动init 进程入口函数
    

    /system/core/init/main.cpp#main()

    -》FirstStageMain
    

    1、挂载创建文件
    2、重定向输入输出到/dev/null:Make stdin/stdout/stderr all point to /dev/null.
    3、初始化内核的日志打印
    4、启动SetupSelinux

    -》SetupSelinux
    

    1.linux 的安全策略 --Android权限–最小权限原则
    2.启动SecondStageMain

    -》SecondStageMain
    

    1.PropertyInit(); --初始化属性域build.prop、default.prop、prop.default等等
    2.处理子进程终止信号 – 僵尸进程

      InstallSignalFdHandler(&epoll);
      InstallInitNotifier(&epoll);
      StartPropertyService(&property_fd);
    

    3.GetBuiltinFunctionMap() --匹配命令和函数之间的关系
    例如:mkdir – 函数匹配
    4.LoadBootScripts(am, sm);–解析init.rc

    -》CreateParser
            //system/core/init/action_parser.cpp、    import_parser.cpp 解析各种属性脚本
      parser.AddSectionParser("service", std::make_unique(&service_list, GetSubcontext(), std::nullopt));
        parser.AddSectionParser("on", std::make_unique(&action_manager, GetSubcontext()));
        parser.AddSectionParser("import", std::make_unique(&parser));
    //解析init
    -》parser.ParseConfig("/system/etc/init/hw/init.rc");
        -》 ParseConfigDir -> ParseConfigFile
            -》ParseData
                -》解析init文件 -- 二进制
    

    5.循环处理脚本 – 启动zygote

    6.进入while循环 — 等待

    auto pending_functions = epoll.Wait(epoll_timeout);
    

    笔记:所有的进程都需要进入while循环,不然函数执行完成后就被清除掉了。类似looper.loop()

    init进程总结

    /system/core/init/main.cpp#main()
    1.挂载文件
    2.设置selinux – 安全策略
    3.开启属性服务,注册到epoll中
    4.解析init.rc
    5.循环处理脚本 – 启动zygote
    6.循环等待

    =========================================================================

    启动zygote

    32位系统
    64位系统

    启动zygote

    /system/core/rootdir/init.rc
        ->init.zygote64_32.rc
             //启动zygote传入的参数
            ->service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    
    /frameworks/base/cmds/app_process/Android.bp
    name: "app_process",
    srcs: ["app_main.cpp"],
    frameworks/base/cmds/app_process/app_main.cpp#main()
    

    问题:
    init.rc 怎么定位到init.zygote64_32.rc?
    init.rc中会import /init.${ro.zygote}.rc 而ro.zygote属性可以在后台获取到:getprop ro.zygote
    app_main.cpp#main()#AppRuntime runtime();怎么进入的AndroidRuntime.cpp的start?
    main函数下面会调用此方法runtime.start

    =======================================================================

    zygote的 native 的启动

    frameworks/base/cmds/app_process/app_main.cpp#main()
    zygote = true;
    startSystemServer = true;
    
    runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
        ->startVm 启动虚拟机
        ->startReg 注册jni
            ->register_jni_procs(gRegJNI,...)
                ->array[i].mProc(env)
        ->env->CallStaticVoidMethod(startClass, startMeth, strArray) -->startClass = com.android.internal.os.ZygoteInit执行main@ZygoteInit.java
    其中,
    static const RegJNIRec gRegJNI[] = {
            REG_JNI(register_com_android_internal_os_RuntimeInit),
            REG_JNI(register_com_android_internal_os_ZygoteInit_nativeZygoteInit),
    
    struct RegJNIRec {
            int (*mProc)(JNIEnv*);
        };
    

    =======================================================================

    zygote的java启动

    1.frameworks/base/core/java/com/android/internal/os/ZygoteInit.java#main()
    2.preload(bootTimingsTraceLog); //预加载,加快进程启动
    3.zygoteServer = new ZygoteServer(isPrimaryZygote); //创建socket
    4.Runnable r = forkSystemServer //启动systemserver进程 AMS等
    5.caller = zygoteServer.runSelectLoop(abiList); //开启循环,接收AMS发送过来的消息

    =======================================================================

    zygote总结

    native
    1.启动虚拟机jvm Android的虚拟机 AndroidRuntime ART
    2.注册jni
    3.调用Zygoteinit#main
    java
    1.预加载,加快进程启动
    2.创建socket
    3.启动systemserver进程
    4.开启循环,接收AMS发送过来的消息

    =========================================================================

    总结

    init进程总结
    /system/core/init/main.cpp#main()
    1.挂载文件
    2.设置selinux – 安全策略
    3.开启属性服务,注册到epoll中
    4.解析init.rc
    5.循环处理脚本 – 启动zygote
    6.循环等待


    zygote总结:

    /system/core/rootdir/init.rc
        ->init.zygote64_32.rc
             //启动zygote传入的参数
            ->service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
    
    /frameworks/base/cmds/app_process/Android.bp
    name: "app_process",
    srcs: ["app_main.cpp"],
    frameworks/base/cmds/app_process/app_main.cpp#main()
    

    zygote启动之native
    1.启动虚拟机
    2.注册jni
    3.调用Zygoteinit#main

    env->CallStaticVoidMethod(startClass, startMeth, strArray) -->startClass = com.android.internal.os.ZygoteInit执行main@ZygoteInit.java
    

    zygote启动之java
    1.预加载,加快进程启动
    2.创建socket
    3.启动systemserver进程
    4.开启循环,接收AMS发送过来的消息

  • 相关阅读:
    38-57-hive-DML-查询
    【C++】C++ 语言对 C 语言的加强 ② ( 变量检测增强 - C++ 不允许重复定义变量 | struct 关键字增强 - struct 作用等同于 class )
    制造工厂生产线液晶电子看板显示终端
    PCL 投影点云
    【21天学习挑战赛—Java编程进阶之路】(6)
    Flask 学习-35.restful-full 自定义错误内容 error_msg 使用
    C++ 之 backtrace
    【色彩管理】色彩管理之截墨
    零基础学Java第六节(面向对象二)
    高斯消元法
  • 原文地址:https://blog.csdn.net/qq_41751728/article/details/139599835