1.从init.rc 里的on nonencrypted被触发时启动,如果是没有加密的Android系统。
on nonencrypted
class_start main
class_start late_start
这个zygote就在 main这个类里,然后一起启动。
2.就在这个init.rc同级目录下就有这个zygote.rc的启动目录,参考这篇文章,打开一个init.zygote32.rc 。
然后就可以看到
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
这第一个就是以服务的方法来启动,然后第二个zygote是名字,第三个是真正的执行程序路径,后面是参数。
3.然后再去找这个/system/bin/app_process,这个是编译的产物,不是源码里的地址。然后需要通过grep来查找。发现在这个 frameworks/base/cmds/app_process/目录下,有mk和main文件然后 分析源文件main。
4.这个app_main.cpp里面,就是分析参数,然后执行这个
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}
这样就通过这个AndroidRuntime来启动Zygotenti了。再往下跟踪这个AndroidRuntime。
5.找到main方法,从上往下看,这个地方Dalvik虚拟机开始开启。
/* start the virtual machine */
JniInvocation jni_invocation;
jni_invocation.Init(NULL);
JNIEnv* env;
if (startVm(&mJavaVM, &env, zygote) != 0) {
return;
}
onVmCreated(env);
然后再往下呢,就是用jni来执行下面这个类里的main方法了。
com.android.internal.os.ZygoteInit
6.接下来跟去ZygoteInit的main方法 。
做了初始化的流程,还有一个预加载各种重要的信息。
preload(bootTimingsTraceLog);
7.接下来是开始SystemServer
下一篇再继续。