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<ServiceParser>(&service_list, GetSubcontext(), std::nullopt));
    parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, GetSubcontext()));
    parser.AddSectionParser("import", std::make_unique<ImportParser>(&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发送过来的消息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值