Zygote主要做了三件事:
调用registerZygoteSocket函数创建用于与ActivityManagerService进行通信的套接字接口;
调用startSystemServer函数启动SystemServer;
调用runSelectLoop函数进入无限循环,并在之前创建的套接字接口上等待ActivityManagerService请求创建新的APP应用程序进程
1 .系统启动脚本system/core/rootdir/init.rc文件显示用于启动Zygote进程的脚本命令。
service zygote/system/CT DMT/app _ process-xzygote/system/CT DMT---zygote-- start-system-server
套接字zygote stream 666
onrestartwrite/sys/Android _ power/request _ state wake
onrestartwrite/sys/power/state on
重新开始重新开始媒体
onrestart restart netd
前面的关键字service指示init进程创建一个名为" zygote "的进程。 此zygote进程运行的程序是/system/ctdmt/app_process,后面是传递给app_process的参数。
以下socket关键字指示此zygote进程需要名为' zygote '的socket资源。 这样,在系统引导后,您会看到/dev/socket目录下有一个名为zygote的文件。 此处定义的套接字类型是UNIX域套接字,它用于本地进程间通信
ActivityManagerService请求通过此套接字与zygote进程进行通信,以fork APP化进程。
最后一组onrestart关键字表示此zygote进程重新启动时必须执行的命令
Step 1. app_process.main
此函数是在frameworks/base/cmds/app _ process/app _ main.CPP文件中定义的。
此函数的主要作用是创建AppRuntime变量并调用其start成员函数
Step 2. AndroidRuntime.start
此函数是在frameworks/base/core/JNI/Android runtime.CPP文件中定义的。
该函数的作用是启动Android系统的运行库,主要执行三件事。 一个是调用函数startVM启动虚拟机,一个是调用函数startReg注册JNI方法,另一个是com.Android.internal.OS.zygote init类的main函数
Step 3. ZygoteInit.main
在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。
主要做了三件事。 一个调用registerZygoteSocket函数创建用于与ActivityManagerService通信的套接字接口,另一个调用startSystemServer函数创建SystemServer组件第三,调用runSelectLoopMode函数进入无限循环,并在之前创建的套接字接口上等待ActivityManagerService请求创建新的APP应用程序进程。
step4. zygote init.registerzygotesocket
在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。
此套接字接口是通过表示上述/dev/socket/zygote文件的文件描述符创建的
step5. zygote init.startsystemserver
在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。
Zygote进程使用Zygote.forkSystemServer函数创建新进程并启动SystemServer组件。 返回0的位置(如pid )是新进程运行的路径。 这意味着新创建的进程将执行handleSystemServerProcess函数
step6. zygote init.handlesystemserverprocess
在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。
Zygote进程创建的子进程继承了上一个Step 4中Zygote进程创建的套接字文件描述符,因为此处的子进程不使用它,所以在此调用closeServerSocket函数将其关闭
Step 7. RuntimeInit.zygoteInit
在frameworks/base/core/Java/com/Android/internal/OS/runtime init.Java文件中定义了此函数。
此函数执行两个操作。 一个是调用zygoteInitNative函数执行Binder进程间通信机制的初始化工作。 完成此任务后,此流程中的Binder对象可以方便地进行进程间通信。 另一种方法是调用上面Step 5中传递的com.Android.server.systemment
step8. runtime init.zygoteinitnative
在frameworks/base/core/Java/com/Android/internal/OS/runtime init.Java文件中定义了此函数。
这里调用全局变量gCurRuntime的onZygoteInit函数
Step 9. SystemServer.main
在frameworks/base/services/Java/com/Android/server/systemserver.Java文件中定义了此函数。
此处的main函数首先执行JNI方法init1,然后init1调用此处的init2函数。 在init2函数中创建一个执行某些系统密钥服务启动操作的ServerThread线程对象。
step 10.zygote init.runselectloopmode
在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。
调用runSelectLoopMode函数进入无限循环,并在之前创建的套接字接口上等待ActivityManagerService请求创建新的APP应用程序进程