Zygote主要工作流程



Zygote主要做了三件事情: 
1. 调用 registerZygoteSocket 函数创建了一个 socket 接口,用来和 ActivityManagerService 通讯; 
2. 调用 startSystemServer 函数来启动 SystemServer; 
3. 调用 runSelectLoop 函数进入一个无限循环在前面创建的 socket 接口上等待 ActivityManagerService 请求创建新的应用程序进程




一.在系统启动脚本system/core/rootdir/init.rc文件中,我们可以看到启动Zygote进程的脚本命令:


service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  
    socket zygote stream 666  
    onrestart write /sys/android_power/request_state wake  
    onrestart write /sys/power/state on  
    onrestart restart media  
    onrestart restart netd  


前面的关键字service告诉init进程创建一个名为"zygote"的进程,这个zygote进程要执行的程序是/system/bin/app_process,后面是要传给app_process的参数。
        接下来的socket关键字表示这个zygote进程需要一个名称为"zygote"的socket资源,这样,系统启动后,我们就可以在/dev/socket目录下看到有一个名为zygote的文件。这里定义的socket的类型为unix domain socket,它是用来作本地进程间通信用的


ActivityManagerService就是通这个socket来和zygote进程通信请求fork一个应用程序进程的了。
        最后的一系列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/AndroidRuntime.cpp文件中:
这个函数的作用是启动Android系统运行时库,它主要做了三件事情,一是调用函数startVM启动虚拟机,二是调用函数startReg注册JNI方法,三是调用了com.android.internal.os.ZygoteInit类的main函数。


Step 3. ZygoteInit.main
        这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
它主要作了三件事情,一个调用registerZygoteSocket函数创建了一个socket接口,用来和ActivityManagerService通讯,二是调用startSystemServer函数来启动SystemServer组件,三是调用runSelectLoopMode函数进入一个无限循环在前面创建的socket接口上等待ActivityManagerService请求创建新的应用程序进程。


Step 4. ZygoteInit.registerZygoteSocket
        这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
这个socket接口是通过文件描述符来创建的,这个文件描符代表的就是我们前面说的/dev/socket/zygote文件了




Step 5. ZygoteInit.startSystemServer
        这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
Zygote进程通过Zygote.forkSystemServer函数来创建一个新的进程来启动SystemServer组件,返回值pid等0的地方就是新的进程要执行的路径,即新创建的进程会执行handleSystemServerProcess函数




Step 6. ZygoteInit.handleSystemServerProcess
        这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
由于由Zygote进程创建的子进程会继承Zygote进程在前面Step 4中创建的Socket文件描述符,而这里的子进程又不会用到它,因此,这里就调用closeServerSocket函数来关闭它




Step 7. RuntimeInit.zygoteInit
        这个函数定义在frameworks/base/core/java/com/android/internal/os/RuntimeInit.java文件中:
这个函数会执行两个操作,一个是调用zygoteInitNative函数来执行一个Binder进程间通信机制的初始化工作,这个工作完成之后,这个进程中的Binder对象就可以方便地进行进程间通信了,另一个是调用上面Step 5传进来的com.android.server.SystemServer类的main函数。




Step 8. RuntimeInit.zygoteInitNative
         这个函数定义在frameworks/base/core/java/com/android/internal/os/RuntimeInit.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. ZygoteInit.runSelectLoopMode
        这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:
调用 runSelectLoopMode 函数进入一个无限循环在前面创建的 socket 接口上等待 ActivityManagerService 请求创建新的应用程序进程
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值