zygote

来源:互联网 发布:java连接符 编辑:程序博客网 时间:2024/05/16 19:52

zygote进程在孵化新进程时,能有效减少系统负担,提高进程孵化速度。Maemo平台的launcher、Qt extended的quick launcher等都是基于相同的目的。

init进程是系统启动后运行在用户空间中的首个进程,init进程启动完系统运行所需的各种daemon后,启动zygote进程。android的服务和应用程序都由zygote进程启动运行。

android设备中运行的进程大致有daemon进程和在dalvik中运行的android应用程序两大类。

其中PID为1的为init进程;PPID为1的为daemon进程,PID为38的即zygote进程,她也是由init(1号进程)启动的,而PPID为38的进程则为zygote的子进程,基本为应用程序(如:com.android.phone)。

在linux中创建并运行一个新进程时,子进程负责把新的进程的代码加载到内存中,父进程的内存信息会被清除,并重新分配内存,形成新的链接库信息,供新进程使用。

在android中,父进程并未说清除内存信息,只是把新的应用程序动态加载,转移执行流程给子进程。

Zygote是由java编写的所以不能直接由init进程来进行启动,必须先生成dalvik虚拟机,之后在dalvik中装载运行ZygoteInit类,执行这一任务的就是app_process进程。

app_process进程首先生成了一个AppRuntime对象,而后分析main函数传递进来的参数,并传递给AppRuntime对象,然后生成并初始化Dalvik虚拟机,再调用执行ZygoteInit类的main方法。

AppRuntime继承自AndroidRuntime类,该类用于初始化并运行Dalvik虚拟机,为运行android应用程序做好准备。在运行虚拟机之前,通过AppRuntime对象,分析环境变量以及运行的参数,并以此生成虚拟机的选项。

app_process参数形式:

app_process [java-options] cmd-dir start-class-name [options]

[java-options]:传递给虚拟机的选项,以“-”开始

cmd-dir:要运行的进程所在的目录

start-class-name:要在虚拟机中运行的类的名称,app_process会将指定的类加载到虚拟机中,而后调用main方法

[options]:要传递给类的选项

app_process运行时,命令(在init.rc文件):

system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

-Xzygote是传递给虚拟机的选项,用以区分在虚拟机中运行的是Zygote还是在Zygote中运行的其它应用程序,被保存在AppRuntime的Option变量中,/system/bin被保存在AppRuntime的没mParentDir变量,--zygote表示加载com.android.internal.os.ZygoteInit类,--start-system-server传递给生成的类,用于启动运行系统服务器。

AppRuntime的start()成员函数,生成并初始化虚拟机。

JNI_CreateJavaVM()函数用来创建并运行虚拟机:

jint  JNI_CreateJavaVM(JavaVM **,JNIEnv **,Void *);

而后调用startReg()函数,用来注册要使用的JNI函数,其最终也是使用:RegisterNatives()函数

app_process不是仅仅只用于加载Zygote类的,根据不同的参数,还会加载不同的类。AppRuntime的start函数会查找指定的类,并调用其main方法(即c/c++调用java类的处理流程findClass之后再GetXXXMethodID获取方法)

到此,是把ZygoteInit类加载到虚拟机中,并执行其main方法,该类的作用是:

1.从ActivityManager接受新的android应用程序的请求,Zygote使用UDS(Unix Domain Socket),它是init进程启动app_process时使用init.rc文件以“dev/zygote”形式注册的套接字。

2.将应用程序中的类,资源,预先加载到内存中。

3.启动系统服务器,源自于--start-system-server参数的指定。

4.监视UDS