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
- zygote
- Zygote
- ZYgote
- Zygote
- Zygote
- Zygote Service
- Zygote 分析
- zygote-->system_server
- Zygote分析
- Zygote简析
- [5] Zygote
- Zygote Service
- Zygote Service
- Zygote详解
- zygote-->system_server
- zygote进程
- Android Zygote
- 认识Zygote
- Js控制flash的操作(非常有用)
- 关于android SDK安装Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-1.xml出错
- 利用java程序模拟登陆新浪微博
- JQ多文件文件上传插件
- <Unity3D>Unity3D中MeshRenderer的使用
- zygote
- OCP-1Z0-051-V9.02-20题
- Android SDK下载和更新失败的解决方法
- 黑马程序员:Object类和equals、toString方法介绍
- 网络子系统73_入口路由缓存查找
- 断点多线程下载
- libid3tag的安装
- 高中必修的指数函数代码
- 事务日志满场景/回溯