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

慈云数据 2024-06-15 技术支持 42 0

目录

    • 启动init
      • init 进程入口函数
      • init进程总结
      • 启动zygote
        • zygote的 native 的启动
        • zygote的java启动
        • 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发送过来的消息

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon