Android 10.0系统启动之Zygote进程(一)-「Android取经之路」
前几节已经讲完了Android10.0的Init启动过程。
Android系统启动之init进程(一)-「Android取经之路」
Android系统启动之init进程(二)-「Android取经之路」
Android 10.0系统启动之init进程(三)-「Android取经之路」
Android 10.0系统启动之init进程(四)-「Android取经之路」
这一节主要来讲解Android10.0 的Zygote进程启动流程。
1.概述
上一节讲解了InIt进程的整个启动流程。Init进程启动后,最重要的一个进程就是Zygote进程,Zygote是所有应用的鼻祖。SystemServer和其他所有Dalivik虚拟机进程都是由Zygote fork而来。
Zygote进程由app_process启动,Zygote是一个C/S模型,Zygote进程作为服务端,其他进程作为客户端向它发出“孵化-fork”请求,而Zygote接收到这个请求后就“孵化-fork”出一个新的进程。
由于Zygote进程在启动时会创建Java虚拟机,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个Java虚拟机的实例拷贝。
2.核心源码
/system/core/rootdir/init.rc
/system/core/init/main.cpp
/system/core/init/init.cpp
/system/core/rootdir/init.zygote64_32.rc
/frameworks/base/cmds/app_process/app_main.cpp
/frameworks/base/core/jni/AndroidRuntime.cpp
/libnativehelper/JniInvocation.cpp
/frameworks/base/core/java/com/android/internal/os/Zygote.java
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
/frameworks/base/core/java/com/android/internal/os/ZygoteServer.java
/frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
/frameworks/base/core/java/android/net/LocalServerSocket.java
/system/core/libutils/Threads.cpp
3.架构
3.1 架构图
3.2 Zygote 是如何被启动的
rc解析和进程调用:Init进程启动后,会解析init.rc文件,然后创建和加载service字段指定的进程。zygote进程就是以这种方式,被init进程加载的。
3.2.1 init.zygote64_32.rc
第一个Zygote进程:
进程名为:zygote
进程通过 /system/bin/app_process64来启动
启动参数:-Xzygote /system/bin --zygote --start-system-server --socket-name=zygotesocket的名称:zygote
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
class main
priority -20
user root //用户为root
group root readproc reserved_disk //访问组支持 root readproc reserved_disk
socket zygote stream 660 root system //创建一个socket,名字叫zygote,以tcp形式 ,可以在/dev/socket 中看到一个 zygote的socket
socket usap_pool_primary stream 660 root system
onrestart write /sys/android_power/request_state wake // onrestart
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
onrestart restart vendor.servicetracker-1-1
writepid /dev/cpuset/foreground/tasks // 创建子进程时,向 /dev/cpuset/foregrou
第二个Zygote进程:zygote_secondary
进程通过 /system/bin/app_process32来启动
启动参数:-Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload
socket的名称:zygote_secondary
service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload
class main
priority -20
user root
group root readproc reserved_disk
socket zygote_secondary stream 660 root system //创建一个socket,名字叫zygote_secondary,以tcp形式 ,可以在/dev/socket 中看到一个 zygote_secondary的socket
socket usap_pool_secondary stream 660 root system
onrestart restart zygote
writepid /dev/cpuset/foreground/tasks
从上面我们可以看出,zygote是通过进程文件 /system/bin/app_process64 和/system/bin/app_process32 来启动的。
对应的代码入口为:frameworks/base/cmds/app_process/app_main.cpp
3.2.2 Zygote进程在什么时候会被重启
Zygote进程重启,主要查看rc文件中有没有 “restart zygote” 这句话。在整个Android系统工程中搜索“restart zygote”,会发现以下文件:
/frameworks/native/services/inputflinger/host/inputflinger.rc
对应进程:inputflinger
/frameworks/native/cmds/servicemanager/servicemanager.rc
对应进程:servicemanager
/frameworks/native/services/surfaceflinger/surfaceflinger.rc
对应进程:surfaceflinger
/system/netd/server/netd.rc 对应进程:netd
通过上面的文件可知,zygote进程能够重启的时机:
inputflinger 进程被杀 (onrestart)
servicemanager 进程被杀 (onrestart)
surfaceflinger 进程被杀 (onrestart)
netd 进程被杀 (onrestart)
zygote进程被杀 (oneshot=false)
system_server进程被杀(waitpid)
3.3 Zygote 启动后做了什么
init进程通过init.zygote64_32.rc来调用/system/bin/app_process64 来启动zygote进程,入口app_main.cpp
调用AndroidRuntime的startVM()方法创建虚拟机,再调用startReg()注册JNI函数;
通过JNI方式调用ZygoteInit.main(),第一次进入Java世界;
registerZygoteSocket()建立socket通道,zygote作为通信的服务端,用于响应客户端请求;
preload()预加载通用类、drawable和color资源、openGL以及共享库以及WebView,用于提高app启动效率;
zygote完毕大部分工作,接下来再通过startSystemServer(),fork得力帮手system_server进程,也是上层framework的运行载体。
zygote任务完成,调用runSelectLoop(),随时待命,当接收到请求创建新进程请求时立即唤醒并执行相应工作。
3.4 Zygote启动相关主要函数:
C空间:
[app_main.cpp] main()
[AndroidRuntime.cpp] start()
[JniInvocation.cpp] Init()
[AndroidRuntime.cpp] startVm()
[AndroidRuntime.cpp] startReg()
[Threads.cpp] androidSetCreateThreadFunc
[AndroidRuntime.cpp] register_jni_procs() --> gRegJNI.mProc
Java空间:
[ZygoteInit.java] main()
[ZygoteInit.java] preload()
[ZygoteServer.java] ZygoteServer
[ZygoteInit.java] forkSystemServer
[Zygote.java] forkSystemServer
[Zygote.java] nativeForkSystemServer
[ZygoteServer.java] runSelectLoop
下一节我们会对代码细节进行详细的讲解