我们知道,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进程为这个应用程序创建一个新的进程。
网友评论