Android framework系列3 -zygote

1、入口

system/core/rootdir/init.zygote64.rc
frameworks/base/cmds/app_process/app_main.cpp

2、流程图

https://note.youdao.com/s/MolK1dkA

3、源码分析

init进程会解析init.zygote64.rc文件,来启动zygote进程

zygote进程入口

首先会初始化AndroidRuntime

AppRuntime继承自AndroidRuntime


我们在启动的时候是传入了zygote 和start-system-server参数的,所以我们会启动zygote,这里看到对这个进程进行了命名。

这里调用了AndroidRuntime的start方法,用于调用ZygoteInit
接下来我们继续查看start方法

这里有创建虚拟机,可以看到虚拟机的参数都是在这里设置的,如果对系统虚拟机进行优化,我们可以在这里做相应的调整。
接下来,我们看到注册jni的方法



这里对Android框架的一些jni进行了注册,举个例子,我们找一下handler下MessageQueue的注册。


这里我们可以看到了MessageQueue的native方法注册。
tips:
1、对于jni动态&静态注册不了解的可以参考文章学习下,https://www.cnblogs.com/pengxurui/p/16526272.html
2、为什么注册jni放到zygote处进行?
1)时机,此时还在c/c++层面执行
2)fork,app进程都是通过zygote进程fork出来的,fork的进程是复制的,在zygote注册了,那么app进程也就注册了JNI(如果zygote进程死了,那么所有的app进程都会挂掉)

我们接着注册jni后继续分析代码,可以看到如下代码,这里通过JNI反射完成了c++层到java层代码的调用。

到此zygote c++层代码流程完成,接下来我们切入到zygote java代码层面分析。

入口main函数

还是按照流程图中的关键函数查看,preload


可以看到这里有加载资源等信息,这个方法是在卡机启动里面比较耗时的函数,如果对开机启动做优化,可以看下这块的逻辑。
接下来我们继续查看,可以看到了有创建zygoteserver和forkSystemServer,最终会循环保持进程活着。