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

results matching ""

    No results matching ""