上一篇分析了init进程的启动过程,最后就是创建Zygote进程,这篇我们将了解Zygote进程是什么,它由什么功能。
在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程fork出来的,Zygote进程在启动时会创建DVM,因此通过Zygote进程创建的应用程序和SystemServer都可以在内部获得一个DVM的实例。
下面开始分析Android 7.0 中Zygote的启动过程:
app_main.cpp
init进程启动Zygote是通过调用app_main.cpp中的mian函数中的AppRuntime的start函数实现的,我们从app_main.cpp中的mian函数开始分析:
目录位于frameworks/base/cmds/app_process/app_main.cpp
|
|
- 将“start-system-server”加入到启动的参数args中
- 调用AppRuntime的start函数启动zygote进程,并将args参数传入到zygoteInit类中,这样启动zygote进程后,会将SystemServer进程启动。
这个函数的主要作用是创建一个AppRuntime的变量,然后调用它的start成员函数,AppRuntime 继承自 AndroidRuntime类,实际上调用的就是 AndroidRuntime类 的 start 函数,下面看看AndroidRuntime 的start函数。
AndroidRuntime
目录位于frameworks/base/core/jni/AndroidRuntime.cpp
|
|
该函数的主要作用是:
- startVm调用用JNI_CreateVM创建出虚拟机
- startReg注册JNI函数
- 找到ZygoteInit的main函数
- 通过JNI调用ZygoteInit的main函数
接下来,Zygote进入到Java的世界。
ZygoteInit.java
目录位于com/android/internal/os/ZygoteInit.java
|
|
- registerZygoteSocket创建socket服务端,用来等待ActivityManagerService请求创建新的应用程序
- preload方法预加载类和资源
- startSystemServer函数启动SystemServer组件
- runSelectLoop使zygote进程进入无限循环,处理请求
接下来分来看看4个步骤的实现过程:
registerZygoteSocket
com/android/internal/os/ZygoteInit.java
|
|
- 获取zygote socket的文件描述符
- 创建服务端的Socket即LocalServerSocket,等待ActivityManagerService请求创建新的应用程序
preload
com/android/internal/os/ZygoteInit.java
|
|
startSystemServer
com/android/internal/os/ZygoteInit.java
|
|
runSelectLoop
zygote调用startSystemServer启动SystemServer进程后,就调用runSelectLoop方法,处理ServerSocket接收到的命令。
com/android/internal/os/ZygoteInit.java
|
|
小结
Zygote进程的工作流程主要是:
- app_main.cpp中main函数创建AppRuntime对象,并调用其start方法来启动Zygote进程
- app_main.cpp中main函数调用JNI_CreateVM创建出虚拟机
- app_main.cpp中main函数通过JNI调用ZygoteInit的mian函数进入Zygote的Java层
- ZygoteInit调用registerZygoteSocket创建socket服务端
- ZygoteInit通过调用runSelectLoop方法等待ActivityManagerService请求创建新的应用程序
- ZygoteInit调用startSystemServer启动SystemServer进程