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

作者 : admin 本文共3970个字,预计阅读时间需要10分钟 发布时间: 2024-06-16 共1人阅读

目录

    • 启动init
      • init 进程入口函数
      • init进程总结
    • 启动zygote
      • zygote的 native 的启动
      • zygote的java启动
      • zygote总结
    • 总结

废话不多说,先上图,不清楚的可以在评论区留言。
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发送过来的消息

本站无任何商业行为
个人在线分享 » Android 14 系统启动流程 之 启动init进程、启动Zygote进程
E-->