android 的Zygote 分析
jollen 發表於 April 5, 2010 3:14 PM
Android 作業系統開機時,會經由 init.rc 來啟動許多外部程式,其中有一個最重要 process 稱為 Zygote。Zygote 是 Android 的 monitor process,它主要負責二項工作:
1. 啟動 system server
2. 執行 Android 應用程式
「System Server」是由 Zygote 所建立的另外一個 process,建立 system server 的方式是使用典型的 Linux system call - fork()。當 Zygote 成功建立 system server 後,便進入 socket listening 模式。在此模式下,zygote 會監聽(listen)由 socket 所傳入的「命令」,並依據命令的內容啟動 Android 應用程式。
Zygote 啟動外部 Android 應用程式的方式,同樣是使用 Linux kernel 所提供的 fork() system call。因此,在 socket 做 listening,並依據命令來 fork() 並執行外部 Android 應用程式,稱之為「Zygote Mode」。
android的系统应用中的一个重要的进程就是zygote,所有的java应用程序进程都是由zygote派生出来的,zygote这个进程的作用就是“生儿子”。具体的一个应用如何出来的大家可以看我以前的一篇文章-----Android 应用初始化及窗体事件的分发。
首先要了解一点初始化语言的基本知识吧:
Services(服务)是一个程序,他在初始化时启动,并在退出时重启(可选)。Services(服务)的形式如下:
service <name> <pathname> [ <argument> ]*
<option>
<option>
Options为选项,具体可以参考linux service命令
zygote进程正是在linux kernel startup后通过这个文件启动的,具体看init.rc中这一段:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
一段一段的分析这个代码:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
启动服务名字zygote. /system/bin/app_process 进程的bin文件具体路径,后面跟的就是启动参数-Xzygote /system/bin --zygote --start-system-server。这段参数有什么作用可以对照看代码app_main.cpp
if (i < argc) {
arg = argv[i++];
if (0 == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);
} else {
set_process_name(argv0);runtime.mClassName = arg;
// Remainder of args get passed to startup class main()
runtime.mArgC = argc-i;
runtime.mArgV = argv+i;LOGV("App process is starting with pid=%d, class=%s./n",
getpid(), runtime.getClassName());
runtime.start();
}
}-Xzygote 这个参数的意义是在jvm中设置gDvm.zygote = true;至于这个参数的具体作用大家自己看代码吧。 其流程是 androidRuntime->start() call---> JNI_CreateJavaVM() call ---->dvmStartup()(戴维林虚拟机初始化) call---->dvmProcessOptions().
/system/bin :也许是告知系统应用的路径吧,大家看到了告诉我。
onrestart write /sys/android_power/request_state wake:
如果这个服务重启了,打开/sys/android_power/request_state 这个文件写入wake字符串。
Zygote Service
在本章我们会接触到这两个单词:
•Zygote [生物] 受精卵, 接合子, 接合体
•Spawn:产卵
通过这两个单词,我们就可以大体知道Zygote是干什么的了,就是叫老母鸡下蛋。通过“Zygote”产出不同的子“Zygote”。从大的架构上讲,Zygote是一个简单的典型C/S结构。其他进程作为一个客服端向Zygote发出”孵化”请求,Zygote接收到命令就“孵化”出一个Activity进程来。Zygote系统代码组成及其调用结构:
•Zygote.java
提供访问Dalvik “zygote”的接口。主要是包装Linux系统的Fork,以建立一个新的VM实例进程。
•ZygoteConnection.java
Zygote的套接口连接管理及其参数解析。其他Actvitiy建立进程请求是通过套接口发送命令参数给Zygote。
•ZygoteInit.java
Zygote的main函数入口。Zygote系统代码层次调用
main()
Startsystemserver()…
RunSelectLoopMode()
Accept socket connection
Conntecion.RunOnce()
Read argument
folkAndSpecialize
folkAndSpecialize使用Native函数Dalvik_dalvik_system_Zygote_forkAndSpecialize
//native 的获取
dalvik/vm/native//dalvik_system_Zygote.c
const DalvikNativeMethod dvm_dalvik_system_Zygote[] = {
{ "fork", "()I",
Dalvik_dalvik_system_Zygote_fork },
{ "forkAndSpecialize", "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkAndSpecialize },
{ "forkSystemServer", "(II[II[[I)I",
Dalvik_dalvik_system_Zygote_forkSystemServer },
{ NULL, NULL, NULL },
};
在这里我们就有了Zygote服务的全貌理解,也在Code中印证了,Activity在本质上是个什么东西,就是一个Linux进程。但是不是一个简单的Linux进程,毕竟Activity是在Andoid概念空间中才有效的。在这个概念空间中,Activity被包装,在屏幕上呈现UI,用户看到的整个屏幕或者一个窗口,对于机器来讲,呈现在用户面前的就叫Actvitiy。从分析中我们可以看到,Android使用了Linux的fork机制。在Linux中Fork是很高效的。
一个Android的Activity实际上一个Linux进程,所谓进程具备下面几个要素,
a.要有一段程序供该进程运行,程序是可以被多个进程共享的。b..进程专用的系统堆栈空间。
c.进程控制块,在linux中具体实现是task_struct
d.有独立的存储空间。fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,在复制过程中,子进程复制了父进程的task_struct,系统堆栈空间和页面表,而当子进程改变了父进程的变量时候,会通过copy_on_write的手段为所涉及的页面建立一个新的副本。所以只有子进程有改变变量时,子进程才新建了一个页面复制原来页面的内容,基本资源的复制是必须的,整体看上去就像是父进程的独立存储空间也复制了一遍。
再看看下面Google在讲解Dalvik虚拟机的图片,我们就大体有了Android系统中Actvitiy的实际映射状态有了基本的认识。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maxleng/archive/2010/04/20/5508488.aspx
android 的Zygote 分析相关推荐
- Android源码分析 - Zygote进程
开篇 本篇以android-11.0.0_r25作为基础解析 上一篇文章Android源码分析 - init进程,我们分析了Android第一个用户进程init进程的启动过程和之后的守护服务 init ...
- Android内存泄漏分析及调试
2019独角兽企业重金招聘Python工程师标准>>> Android内存泄漏分析及调试 分类: Android2013-10-25 11:31 5290人阅读 评论(5) 收藏 举 ...
- Android 系统(74)--Android重启原因分析
Android重启原因分析 重启原因分类 1.上层造成重启 system_server被杀 watchdog重启 重要线程阻塞 2.kernel造成重启 空指针 非法地址 3.kernel watch ...
- android释放acitity内存,Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
- android挂载usb设备,android usb挂载分析---MountService启动
在android usb挂载分析----vold启动,我们的vold模块已经启动了,通信的机制也已经建立起来了,接下来我们分析一下MountService的启动,也就是我们FrameWork层的启动, ...
- Android源码分析-全面理解Context
前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...
- Android Studio +MAT 分析内存泄漏实战
点击打开链接 对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些 ...
- Android源码分析--MediaServer源码分析(二)
在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...
- Android系统启动流程分析之安装应用
2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295) (0) 举报 收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...
最新文章
- 如果我有jQuery背景,那么“ AngularJS中的思考”吗? [关闭]
- 全志uboot修改_全志SDK编译问题解决二:build uboot only
- (转)Cobbler无人值守批量安装Linux系统
- Js原生元素选择器 _$获取id class attr 属性集合
- 搞定操作系统面试,看这篇就够了(二)
- 8051 r0-r7 是什么
- IDEA配置hadoop依赖jar包(非Maven)
- CS231n——机器学习算法——线性分类(上: 线性分类器)
- 【5G NR】SSB
- STC12C5A60S2 双串口
- ZooKeeper示例 实时更新server列表
- XCode14 iOS16适配 pod签名
- 劳务员培训建筑八大员培训劳务员对劳务分包企业管理的建议
- element 时间选择器 限制时分秒_关于elementUI里日期选择器禁用时间的一些小技巧...
- MAP(Maximum A Posteriori,最大后验准则)算法
- Android内存泄露抓取工具leakcanary
- 中国下一代互联网(CNGI)建设市场投资前景预测与发展战略规划研究报告2021~2027年
- webgl第27课-三维空间-不同位置的三角形
- 设立测绘地理信息安全保密工作机构
- 计算机考研专业课938,中国地质大学938《分析化学》2018考研大纲
热门文章
- windows下使用nvcc和nvprof
- opencv中imread函数的使用
- JavaScript 实现web随机数排序、整除、重置
- 如何在win10安装libaio,并且使用CFLAGS和LDFLAGS环境变量指示其位置,并且如何设置DS_BUILD_AIO=0禁用async_io...
- 上传文件到gitee仓库的步骤
- RGB转YUV420,支持NV12(420p)和NV21(420sp)
- 大点干!早点散----------深入剖析GFS分布式文件系统
- 如何查看内核版本和ubuntu版本
- python 上传图片到七牛云上
- 【Hadoop】P2 Hadoop简介