前言
Zygote进程是Android进程中的核心进程,为啥呢?前面介绍过的进程启动篇中,我们知道,我们的应用进程都是在Zygote进程中fork出来的,这难道还不能证明他的重要性么。
而Zygote进程是在init进程中,通过解析init.rc文件,启动的。我们看下init.rc中相关的部分。
|
|
没错,就是这个,在Android5.0之后,开始支持64位编译,因为我看的源码是6.0的,那么就看下init.zygote64.rc文件吧。
|
|
根据init.rc语法中service部分
|
|
可知,上面指定的路径为/system/bin/app_process64,参数为-Xzygote /system/bin –zygote –start-system-server
而android启动中各种命令对应的在/framework/base/cmds下,而这个下面app_process下,只有app_main,一个cpp文件,因此,我么从这个cpp文件说起
app_main的main函数
代码分段开赛
|
|
- 首先创建AppRuntime,也在该文件中,并且保存参数,添加option选项
|
|
- 对参数进行解析,解析完毕之后,如下
- niceName ,zygote
- startSystemServer为true
- zygote为true
|
|
- 准备参数
- 设置进程nicename
|
|
最后,调用runtime.start方法。因为AppRuntime继承了AndroidRuntime,start方法的实现在AndroidRuntime中,因此,我们看AndroidRuntime。
AndroidRuntime#start 方法
在这个方法中呢,做了很多事情,我们来看代码。
|
|
做了哪些事呢?
- 获取系统目录,设置环境变量
- startVm 启动虚拟机
- 调用onVmCreated
- startReg 注册系统的jni函数,如nativeZygoteInit等
- 最后调用ZygoteInit的main方法
ZygoteInit#main
改方法如下
|
|
- 根据传入的参数初始化一些参数,
- registerZygoteSocket 注册zygote socket
- preload 预加载一些东西
- startSystemServer 启动SystemServer进程
- runSelectLoop进入循环,监听连接、入去参数,fork进程
在registerZygoteSocket中,会创建本地socket 服务端。
ZygoteInit#preload
|
|
- preloadClasses,加载/system/etc/preloaded-classes文件中的类
- preloadResources家在系统资源,preloaded_drawables和preloaded_color_state_lists
- preloadOpenGL 加载opengl
- preloadSharedLibraries,加载android,compiler_rt,jnigraphics三个共享库
- preloadTextResources 记载超文本链接符号,大概就是哪些标签吧,我们textview加载html.
- 预加载webview用到的一些东西
ZygoteInit#runSelectLoop
这个讲进程启动的时候,已经说到过了,这里就不细说了,就是不断监听socket客户端的接入,并且读取参数,进行fork进程。
遗留
关于SystemServer的启动,留在下篇吧。