1Zygote是如何创建的?
Zygote是由init进程根据init.rc文件中的配置项而创建的。
2Zygote名字的来历?
zygote最初的名字叫“app_process”,这个名字是在Android.mk文件中被指定的,但app_process在运行过程中,通过Linux下的pctrl系统调用将自己的名字换成了“zygote”,所以我们通过ps命令看到的进程名是“zygote”。
3Zygote的重要功能是如何完成的?
Zygote的这个main函数虽很简单,但其重要功能却是由AppRuntime的start来完成的。
4AppRuntime介绍
AppRuntime和AndroidRuntime的关系
5开创Android系统中Java世界需要哪三部曲?
(1)创建虚拟机——startVm
我们先看三部曲中的第一部:startVm,这个函数没有特别之处,就是调用JNI的虚拟机创建函数,但是虚拟机创建时的一些参数却是在startVm中被确定的。
(2)注册JNI函数——startReg
前面已经介绍了如何创建虚拟机,下一步则需要给这个虚拟机注册一些JNI函数。正是因为后续Java世界用到的一些函数是采用native方式来实现的,所以才必须提前注册这些函数。
(3)调用CallStaticVoidMethod()函数
6ZygoteInit的main函数中进行了哪些操作?
(1)建立IPC通信服务端——registerZygoteSocket
Zygote以及系统中其他程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的Socket。registerZygoteSocket函数的使命正是建立这个Socket。
(2)预加载类和资源
现在我们要分析的就是preloadClasses和preloadResources函数了。
说明:preload_class文件由framework/base/tools/preload工具生成,它需要判断每个类加载的时间是否大于1250微秒,超过这个时间的类就会被写到preload-classes文件中,最后由zygote预加载。这方面的内容,读者可参考有关preload工具中的说明,这里就不再赘述。
preloadClass函数的执行时间比较长,这是导致Android系统启动慢的原因之一。对这一块可以做一些优化,但优化是基于对整个系统有比较深入了解才能实现的。
注意:在拓展思考部分中,我们会讨论Android启动速度问题。
preloadResources和preloadClass类似,它主要是加载framework-res.apk中的资源。这里就不再介绍它了。
说明:在UI编程中常使用的com.android.R.XXX资源,是系统默认的资源,它们就是由Zygote加载的。
(3)启动system_server
我们现在要分析的是第三个关键点:startSystemServer。这个函数会创建Java世界中系统Service所驻留的进程system_server,该进程是framework的核心。如果它死了,就会导致zygote自杀。
(4)有求必应之等待请求——runSelectLoopMode
当Zygote从startSystemServer返回后,将进入第四个关键函数:runSelectLoopMode。前面,在第一个关键点registerZygoteSocket中注册了一个用于IPC的Socket,不过那时还没有地方用到它。它的用途将在这个runSelectLoopMode中体现出来。
7关于 Zygote的总结
Zygote是创建Android系统中Java世界的盘古,它创建了第一个Java虚拟机,同时它又是女娲,它成功地繁殖了framework的核心system_server进程。做为Java语言的受益者,我们理应回顾一下Zygote创建Java世界的步骤:
(1)创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
(2)调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
(3)通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。然而在这个世界刚开创的时候,什么东西都没有。
(4)调用registerZygoteSocket。通过这个函数,它可以响应子孙后代的请求。同时Zygote调用preloadClasses和preloadResources,为Java世界添砖加瓦。
(5)Zygote觉得自己工作压力太大,便通过调用startSystemServer分裂一个子进程system_server来为Java世界服务。
(6)Zygote完成了Java世界的初创工作,它已经很满足了。下一步该做的就是调用runSelectLoopMode后,便沉沉地睡去了。()(7)Zygote随时守护在我们的周围,当接收到子孙后代的请求时,它会随时醒来,为它们工作。
8SystemServer的调用流程
9Zygote是如何分裂和繁殖的?
(1)ActivityManagerService发送请求
ActivityManagerService也是由SystemServer创建的。假设通过startActivit来启动一个新的Activity,而这个Activity附属于一个还未启动的进程,那么这个进程该如何启动呢?先来看看ActivityManagerService中的startProcessLocked函数。
(2)有求必应之响应请求
ZygoteInit
这个android.app.ActivityThread类,实际上是Android中apk程序所对应的进程,它的main函数就是apk程序的main函数。
10Zygote分裂的总结
11