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);