android系统启动流程之zygote(Native)启动分析

zygote有一部分运行在native,有一部分运行在java层,它是第一个进入java层的进程
zygote在启动时,在init.${ro.zygote}.rc脚本中,里面描述了zygote是如何被启动的,

 当init进程解析到zygote.rc文件时,将根据解析出来的命令启动zygote.

zygote的程序源文件为app_main.cpp: 根据frameworks/base/cmds/app_process/Android.bp找到对应的cpp文件
zygote被编译出来的进程名为app_process,位于/system/bin/下。

也就是说app_process这个可执行程序的名称其实就是zygote, 它的C++源文件是app_main.cpp.

并且,Android的运行时环境是由zygote启动的。

下面开始进行Zygote启动时的C++ Native层代码分析:

app_main.cpp->main(): //zygote的作用--->进入到java层,生孩子。
  //zygote传入的参数为:-Xzygote /system/bn/ --zygote --start-system-server --socket-name=zygote
  -->AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
  //处理zygote传入的参数,代码省略,有时间再细看。
  //设置程序运行标记,将参数转为变量标记
     while{
        if(strcmp(arg,"--zygote") == 0)
          zygote=true;  //命中
        if(strcmp(arg, "--start-system-server") == 0)
          startSystemServer = true; //命中
     }

     if(zygote) //启动zygoteinit
        //这个是zygote的native的启动
        runtime.start("com.android.internal.os.ZygoteInit",args,zygote);
          -->进入到runtie的父类AndroidRuntime::start()去执行;//位于frameworks/base/core/jni/AndroidRuntime.cpp->start()
            -->//进入到安卓运行时环境的启动
               startVM();//启动虚拟机   zygote进程-->startVM启动虚拟机(是在Zygote里面),本质是虚拟机代码实现了:内存管理 
               //每个app进程均由zygote fork出来,所以每个app进程里均有一个虚拟机,来自Zygote.
                //对虚拟机一系列的参数配置初始化,如下
                -->parseRuntimeOption("dalvik.vm.heapsize", heapsizeOptsBuf,"-Xmx","16m"); //16M堆大小
               onVmCreated(env);
               
               startReg();//注册jni,建立桥梁,将java的本地方法与native方法进行关联映射
                -->androidSetCreateThreadFunc();
                   //gRegJNI是函数指针数组,数组中的每个成员是一个函数指针,
                   register_jni_procs(gRegJNI, NELEM(gRegJNI),env);//真正注册
                    -->array[i].mProc(env);//for循环遍历函数,每个函数就是注册,也就是真正关联的地方。
                   
               //执行某个类中的某个方法:即进入到ZygoteInit.java->main()方法
               env->CallStaticVoidMethod(startClass, startMeth, strArray);
               
     else if(className) //安卓app应用启动时处理
        runtime.start("com.android.internal.os.RuntimeInit",args,zygote);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值