Android --- Zygote和System进程启动过程简要分析
Android --- Zygote和System进程启动过程简要分析
在看过《Android情景源代码》的Zygote启动章节后,作如下简要总结。Zygote进程在init进程启动过程中被以service服务的形式启动:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
第一行表示zygote进程是以服务的形式启动的,其对应的可执行程序是/system/bin/app_process,后面四个参数是它的启动参数。第二名表示在Zygote启动过程中,要在其内部创建一个名为zygote的socket,它在Linux下的权限是666,即所有用户多可以对它进行读写。
因为Zygote是以service的形式启动,所以在init启动过程中,android-5.1.0_r3\android5.1\system\core\init\init.c的service_start()函数会被调用。
service_start函数的主要工作是:
- 通过fork()方法创建一个新的子线程,即Zygote线程
- 调用create_socket()函数创建启动脚本中的zygote socket,并保存该socket的int型的文件描述符。创建时,还会为此socket创建一个类型为AF_UNIX的Socket地址,并调用bind()方法将socket与此地址进行绑定。该socket还有一个对应的设备文件,/dev/socket/zygote。
- 创建完socket后,会调用publish_socket()函数将该socket发布到系统中。采用环境变量的方式,ANDROID_SOCKET_zygote -- socket的文件描述符。
- 调用execve(svc->args[0]),执行app_process的主程序app_main.cpp。此时,代码进入到native层。
app_main.cpp的main函数的主要工作是:
- 通过调用AppRuntime::start()函数,通过JNI的方式,进一步启动Zygote:AppRuntime.start("com.android.internal.os.ZygoteInit", args);args是参数列表,其中较重要的是标记是否要启动System进程、记录socket名称。
ZygoteInit的main函数的主要工作是:
- 调用registerZygoteSocket("zygote")函数获取到zygote socket文件描述,并根据此描述符创建一个本地服务Socket:LocalServerSocket。这个服务Socket是用来等待Activity管理服务ActivityManagerService请求Zygote进程创建新的应用程序进程的。
- 调用startSystemServer()函数启动System进程,以便它可以将系统的关键服务启动起来。该方法中通过forkSystemServer()函数创建System进程,最后调用handleSystemServerProcess()进一步启动System进程("com.android.server.SystemServer",通过反射技术),"--runtime-init"表示需要提供Binder服务。
- 调用runSelectLoop()来等待Activity管理服务ActivityManagerService请求Zygote进程创建新的应用程序进程。
SystemServer的main函数的主要工作是:
- 启动一个线程,启动系统的关键服务。