Zygote的Java启动分析, 这边需要分清一个概念,zygote进程只有一个,没有区分zygote的java进程或native进程之类的,只是进程运行时调用的代码语言不同,所以涉及C++的native或java层。
Java层的代码分析如下,不算多,但是比较重要:
ZygoteInit.main()://预加载(非常重要):提前加载好一些app需要的资源,这样zygote fork时就不需要再重复初始化处理了,加快进程启动-->preload(bootTimingsTeraceLog); -->预加载一些类,加载的类在/system/etc/preloaded-classes文件中的所有类。-->预加载的一些资源:com.android.internal.R.xx//这个就是Zygote socket,AMS通知zygote启动app就是通过此socket发消息-->zygoteServer = new ZygoteServer(isPrimaryZygote); -->Zygote.createManagedSocketFromInitSocket(); //在构造函数中创建zygoteSocket.Runnable r = forkSystemServer() ; //启动SystemServer进程。caller = zygoteServer.runSelect(abiList);//进入一个死循环。接收AMS传过来的消息。
zygote总结:
native层做了3件事:
- 初始化运行时环境, 创建 JVM,这就是android的虚拟机,AndroidRuntime ART
- 注册JNI
- 调用zygoteinit.main()方法
java层做了以下几件事:
- 加快进程启动的预加载:加快进程启动
- socket:让AMS通知我
- 启动大儿子:SystemServer.
- 循环等待。
因此,zygote进程的所有的目的是为了生孩子 ,通过zygote启动app,而app是java层代码,它要运行,需要JVM的支持,所以zygote需要先准备好Jvm提前准备好虚拟机,并且app在启动后,可能需要调用访问C++ Native代码,这时需要JNI的支持,所以JNI的注册也放到了zygote进程中,也提前准备好了。当条件满足之后,zygote创建app后,app就能顺利的执行了。并且zygote的preload预加载资源也是出于这些目的,为了让app能够快速的运行,提前预加载了app
所需要的一些java资源,包括系统资源,系统库,classes,RES等,因为这些资源app的java都有可能去调用的。