Zygote的作用
由Zygote孵化出所有的基于java虚拟机的实例Service。
通过如下的图可以看出(通过adb shell ps查看和汇总Linux进程信息),
(1)第一个进程Init作为1号进程, 创建了536/537/538/539/540/541/542/543等一系列的进程。
(2)其中的541号进程,即是Zygote进程。
(3)Zygote进程创建了565/610/612/636/656/664/711等系列的进程,其中565即为System_server。
Zygote的启动流程
zygote是在init.rc中定义的一个服务进程。system\core\rootdir\init.rc的关键信息:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
服务名称为:zygote
启动该服务执行的命令: /system/bin/app_process
命令的参数: -Xzygote /system/bin –zygote –start-system-server
socket zygote stream 660创建一个名为:/dev/socket/zygote 的 socket, 类型为:stream,权限为:660
onrestart:当服务重启时,执行该关键字后面指定的Command。
zygote进程的程序入口:
通过app_process 可执行文件的名称,找到frameworks\base\cmds\app_process\Android.mk文件,其中定义了app_process可执行文件编译相关参数,由此在frameworks\base\cmds\app_process目录下找到了frameworks/base/cmds/app_process/app_main.cpp源代码文件,其中的main函数即为Zygote进程的入口。
zygote进程的main函数
将init.rc中指定的-Xzygote参数传给JVM。
将进程的名字改为zygote。
执行AppRuntime类的start()方法,runtime.start(“com.android.internal.os.ZygoteInit”, true)。
runtime.start函数,即在frameworks\base\core\jni\AndroidRuntime.cpp文件中实现具体的处理逻辑,其中有两个关键处理逻辑:
(1)AndroidRuntime::startVm()中,设置一些虚拟机的参数后,通过JNI_CreateJavaVM()启动虚拟机。
(2)env->CallStaticVoidMethod,调用ZygoteInit类的main()方法,正式进入到Java世界。
Java世界
ZygoteInit类的main()方法:
(1)registerZygoteSocket,创建Socket服务端对象sServerSocket。
(2)调用startSystemServer方法启动系统服务system_server。
(3)runSelectLoopMode监听和处理sServerSocket的Socket请求。
ZygoteInit类的main()方法中首先会创建Socket服务端对象sServerSocket,最后调用runSelectLoopMode方法,监听和处理sServerSocket请求。其中关键的代码详情如下:
while (true) {
try {
fdArray = fds.toArray(fdArray);
index = selectReadable(fdArray);//多路Select,响应Socket请求
} catch (IOException ex) {
throw new RuntimeException("Error in select()", ex);
}
done = peers.get(index).runOnce();
}
runSelectLoopMode中while(true)循环,接收到Socket请求后,会fork出子进程,子进程调用handleChildProc方法,最终抛出RuntimeInit.invokeStaticMain异常,退出while(true)循环,进入到android.app.ActivityThread类的main方法执行;父进程调用handleParentProc方法,再次进入runSelectLoopMode中while(true)循环,准备接收下一个的请求事件。
handleChildProc进行子进程的后续处理见调用堆栈:
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at com.android.internal.os.RuntimeInit.invokeStaticMain(RuntimeInit.java:222) at com.android.internal.os.RuntimeInit.applicationInit(RuntimeInit.java:307) at com.android.internal.os.RuntimeInit.zygoteInit(RuntimeInit.java:269) at com.android.internal.os.ZygoteConnection.handleChildProc(ZygoteConnection.java:842) at com.android.internal.os.ZygoteConnection.runOnce(ZygoteConnection.java:249) at com.android.internal.os.ZygoteInit.runSelectLoopMode(ZygoteInit.java:654) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:547) at dalvik.system.NativeStart.main(Native Method)
ZygoteInit类中的main方法中捕获MethodAndArgsCaller异常,并调用异常对象的run方法。即android.app.ActivityThread类的main方法,开始Activity的创建流程。
Zygote分裂的第一个进程system_server
system_server进程的启动入口在ZygoteInit.java 文件中的startSystemServer方法,有两个关键点:
(1)forkSystemServer,调用Native方法fork子进程。
(2)通过forkSystemServer方法返回的值,进入两个分支处理:父进程返回true值,进入到ZygoteInit类中的main方法继续处理;而子进程调用handleSystemServerProcess方法,最终会运行system_server。
跟踪handleSystemServerProcess的后续处理,发现在com.android.internal.os.RuntimeInit类中的invokeStaticMain方法,抛出了throw new ZygoteInit.MethodAndArgsCaller(m, argv),异常一层一层上抛,结果在ZygoteInit类中的main方法中捕获此异常,并且调用MethodAndArgsCaller对象的run方法,将调用com.android.server.SystemServer类中的main方法。
Zygote总结
(1)启动zygote,进入java世界
(2)创建第一个system_server
(3)Zygote服务端监听fork子进程请求