step1. init进程根据init.rc中的zygote配置fork一个进程加载/system/bin/app_process.(入口在framework/base/cmds/app_process/app_main.cpp中)
step2. app_main.cpp/main
通过AppRuntime调用其父类AndroidRuntime==>runtime.start("com.android.internal.os.ZygoteInit",startSystemServer)函数处理。
step3. AndroidRuntime.cpp/start
AndroidRuntime::start(x,x)函数call startVm(&mJavaVM, &env)启动虚拟机, call startReg(env)注册jni方法,call env->CallStaticVoidMethod(startClass, startMeth, strArray)进入com.android.internal.os.ZygoteInit类的main方法。
step4. ZygoteInit.java/main
ZygoteInit.main call registerZygoteSocket()创建一个socket接口用来和ActivityManagerService通信,call preloadClasses()来预先加载java类,call preloadResources()来加载资源,call startSystemServer()来启动SystemServer进程,最后call runSelectLoopMode()进入一个无限循环在前面创建的socket接口上等待ActivityManagerService的请求,创建新的应用程序进程。
本文详细解析了Android系统中Zygote进程的启动过程,包括init进程如何根据init.rc配置fork并加载app_process,以及从app_main.cpp到ZygoteInit.java的主要步骤。涵盖了虚拟机启动、JNI方法注册、ZygoteInit类的main方法执行、预加载Java类和资源等关键环节。
1521

被折叠的 条评论
为什么被折叠?



