Android 源码分析之Zygote && SystemServer
Zygote
故名思议就是“受精卵”的意思,受精卵的特点就是它是新生命的开始,并且受精卵一般都可以携带一些父辈的遗传信息。Zygote在Android系统中就相当于一个应用程序的受精卵一样,会生成出新的应用,我们知道Linux系统中要创建一个进程需要先调用fork方法,fork得到的进程大部分数据是和父辈进程是一致的,也就是说子进程和父进程之间共享着内存空间。只有在调用exec方法的时候才会用新的可执行文件的内容替换当前进程的代码段,数据段,堆栈等数据。但是在Android系统中Zygote在初始化的时候会创建Delvik虚拟机,在这个阶段会将系统的类库,资源文件,共享库加载到内存,在后续Zygote fork出子进程后,这个子进程也就有了上述资源,就不需要重新加载了,只需要装载APK中的字节码就可以直接运行了,所以会在很大程度上缩短启动进程的时间。
SystemServer
一般我們在开发应用的时候如果要使用一个服务需要运行startService,来启动一个服务,但是我们在使用系统服务的时候却不需要,而是只需要调用getSystemService()来获得系统服务,这是因为我们上面提到的在系统启动的时候,Zygote会最早生成的一个SystemServer这个运行在Dalvik虚拟机上的Java进程。上面运行着多种系统服务,也就说这些服务在已经启动好了的,不需要我们重新启动。
下面是整个SystemServer以及MediaServer启动的整个过程,先上图,后补上详细的代码分析,哎,又欠了一大段文字,哈哈,不过我喜欢。大家看图估计看得更清楚些: