美文网首页
Zygote进程启动笔记

Zygote进程启动笔记

作者: 百花鱼藤 | 来源:发表于2018-07-02 22:45 被阅读0次

         我们知道,Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的
    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一个应用程序进程的了。

    app_process.main:

    创建AppRuntime变量,调用start("com.android.internal.os.ZygoteInit",startSystemServer))方法,AppRuntime 继承AndroidRuntime
     AndroidRuntime.start:一是调用函数startVM启动虚拟机,二是调用函数startReg注册JNI方法,三是调用了com.android.internal.os.ZygoteInit类的main函数。

    ZygoteInit.main
    调用registerZygoteSocket函数创建了一个socket接口,用来和ActivityManagerService通讯,调用startSystemServer函数来启动SystemServer组件,调用runSelectLoopMode函数进入一个无限循环在前面创建的socket接口上等待ActivityManagerService请求创建新的应用程序进程。

    ZygoteInit.registerZygoteSocket
     获取文件描述符,创建LocalServerSocket,这个socket接口是通过文件描述符来创建的,这个文件描符代表的就是/dev/socket/zygote,在init.c文件中,是由service_start函数来解释init.rc文件中的service命令的
     每一个service命令都会促使init进程调用fork函数来创建一个新的进程,在新的进程里面,会分析里面的socket选项,对于每一个socket选项,都会通过create_socket函数来在/dev/socket目录下创建一个文件,在这个场景中,这个文件便是zygote了,然后得到的文件描述符通过publish_socket函数写入到环境变量中去:
    ActivityManagerService是通过Process.start函数来创建一个新的进程的,而Process.start函数会首先通过Socket连接到Zygote进程中,最终由Zygote进程来完成创建新的应用程序进程,而Process类是通过openZygoteSocketIfNeeded函数来连接到Zygote进程中的Socket的

    ZygoteInit.startSystemServer
    Zygote进程通过Zygote.forkSystemServer函数来创建一个新的进程来启动SystemServer组件,新创建的进程会执行handleSystemServerProcess函数。

    ZygoteInit.handleSystemServerProcess
    closeServerSocket函数来关闭ServerSocket,调用RuntimeInit.zygoteInit函数来进一步执行启动SystemServer组件。

    RuntimeInit.zygoteInit
    调用zygoteInitNative函数来执行一个Binder进程间通信机制的初始化工作,这个工作完成之后,这个进程中的Binder对象就可以方便地进行进程间通信了,调用SystemServer类的main函数invokeStaticMain

    RuntimeInit.zygoteInitNative :native方法,执行zygoteInitNative 
    SystemServer.main:会创建一个ServerThread线程对象来执行一些系统关键服务的启动操作。

     ZygoteInit.runSelectLoopMode

    总结一下:
    1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。
     2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。
     3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。

    相关文章

      网友评论

          本文标题:Zygote进程启动笔记

          本文链接:https://www.haomeiwen.com/subject/kcrruftx.html