教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教学研究 >

Android 深入浅出之Zygote

来源:网络收集 时间:2026-09-10
导读: Android 深入浅出之Zygote 一目的 zygote,是Android 搞出来的一个东西。网上讲这个的也非常多。第一次看到这个名字我就 挺郁闷,想干嘛这是?Linux 下名字都取得挺通俗易懂,深得人心。zygote?不就想模仿Linux 下的fork 吗?个人觉得Google 取名字挺怪,包

Android 深入浅出之Zygote

一目的

zygote,是Android 搞出来的一个东西。网上讲这个的也非常多。第一次看到这个名字我就

挺郁闷,想干嘛这是?Linux 下名字都取得挺通俗易懂,深得人心。zygote?不就想模仿Linux

下的fork 吗?个人觉得Google 取名字挺怪,包括Google 本身。

不管怎样,Zygote 依然是Android 系统的核心,zygote 是受精卵的意思,可以认为是Android

framework 大家族的祖先!我们本节的目的是描述下zygote 的来龙去脉,顺便揭露下它的短处,

以后大家可以对症下药,变异一个更加优良的品种。

二 Zygote

zygote 本身是一个应用层的程序,和驱动,内核模块之类的没点关系。这下大家放心点了 吧?zygote 的启动由linux 的祖先init 启动。这个在init 分析中提过。这里就不说了。 zygote,ps 中看到的进程名叫zygote,其最初的名字是app_process,通过直接调用pctrl 把

名字给改成了”zygote”。不过不影响我们分析。

zygote 的代码在framework/base/cmds/app_process/App_main.cpp 中。我们一步步来看。 既然是应用程序,直接看main 咯。

[---->main]

int main(int argc, const char* const argv[])

{

//参数很重要啊,还记得init 分析吗?

//恩,这几个参数就是:(一定要记住我们的情景分析方法!)

//zygote /system/bin/app_process

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

// These are global variables in ProcessState.cpp

mArgC = argc;

mArgV = argv;

mArgLen = 0;

for (int i=0; i<argc; i++) {

mArgLen += strlen(argv[i]) + 1;

}

mArgLen--;

AppRuntime runtime;

//AppRuntime 是个什么玩意儿?addVmArguments?好像和虚拟机有点关系喔

int i = runtime.addVmArguments(argc, argv);

[--->AppRuntime]

class AppRuntime : public AndroidRuntime

从AndroidRuntime 中派生而来,是和dalvik 交互的一个方便类,这里先不说了。

[---->main]

...

int i = runtime.addVmArguments(argc, argv);

....

if (i < argc) {

arg = argv[i++];

if (0 == strcmp("--zygote", arg)) {

bool startSystemServer = (i < argc) ?

strcmp(argv[i], "--start-system-server") == 0 : false;

//废话,根据我们的参数,startSystemServer=true

setArgv0(argv0, "zygote");

//改名字,不知道windows 下的怎么改、linux 下的可以用pctrl 系统调用

set_process_name("zygote");

//start?记住我们的参数

runtime.start("com.android.internal.os.ZygoteInit",

startSystemServer);

}

} else {

return 10;

}

FT,app_main 还是很简单的,但是runtime.start 看起来不简单啊,传进去的那个参数 “com.android.internal.os.ZygoteInit“挺像java 类的命名规则。

2.1 AppRuntime

好了,代码进入到runtime.start("com.android.internal.os.ZygoteInit",true)了。source insight 直

接进去看看。代码在framework/base/core/jni/AppRuntime.cpp 中。

[--->void AndroidRuntime::start()]

void AndroidRuntime::start(const char* className, const bool startSystemServer) {

LOGD("\n>>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<\n");

char* slashClassName = NULL;

char* cp;

JNIEnv* env;

//linux 下signal 的处理,没什么好说的

blockSigpipe();

//设置环境变量ANDROID_ROOT 为/system

const char* rootDir = getenv("ANDROID_ROOT");

if (rootDir == NULL) {

rootDir = "/system";

setenv("ANDROID_ROOT", rootDir, 1);

}

/*启动虚拟机*/

if (startVm(&mJavaVM, &env) != 0)

goto bail;

启动虚拟机,和JAVA 有关系了吧?Android 最重要的sdk 都是java,那虚拟机这部分肯定

要进去看看的。

[--->int AndroidRuntime::startVm()]

int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)

{

//唉,大部分都是设置java 虚拟机的启动参数。不过有几个参数比较重要。

//checkjni,可能没使用过jni 的一辈子都不能体会

//说白了,就是我们在C++层调用jni 函数的时候,会对参数或者什么的进行检查 //要是不合法的话,直接把虚拟机exit!第一个影响速度,第二个是影响程序。

//这个只作为开发时候使用。

property_get("dalvik.vm.checkjni", propBuf, "");

if (strcmp(propBuf, "true") == 0) {

checkJni = true;

} else if (strcmp(propBuf, "false") != 0) {

/* property is neither true nor false; fall back on kernel parameter */

property_get("ro.kernel.android.checkjni", propBuf, "");

if (propBuf[0] == '1') {

checkJni = true;

}

}

//设置虚拟机最大heapsize,才给16M,似乎有点少,尤其是在做图片操作的

//随便一个几百兆的图片就会把虚拟机搞死。

strcpy(heapsizeOptsBuf, "-Xmx");

property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");

opt.optionString = heapsizeOptsBuf;

mOptions.add(opt);

LOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");

if (checkJni) {

/* extended JNI checking */

opt.optionString = "-Xcheck:jni";

mOptions.add(opt);

/* set a cap on JNI global references */

opt.optionString = "-Xjnigreflimit:2000";

mOptions.add(opt);

}

//具体dalvik 虚拟机有哪些参数,可以参考Dalvik 的说明

//反正调用了下面这个函数,虚拟机就按您指定的参数启动了。

if (JNI_CreateJavaVM(pJavaVM, pEnv, &initArgs) < 0) {

LOGE("JNI_CreateJavaVM failed\n");

goto bail;

}

result = 0;

bail:

free(stackTraceFile);

return result;

}

OK,虚拟机起来了,看看我们在runtime.start 中还要做什么

[--->void AndroidRuntime::start()]

if (startVm(&mJavaVM, &env) != 0)

...

//startReg?

if (startReg(env) < 0) {

goto bail;

}

看看去。

[--->int AndroidRuntime::startReg()]

为何不把startReg 改成startRegister()。

int AndroidRuntime::startReg(JNIEnv* env)

{

//这个名字还是很清楚的,设置创建线程 …… 此处隐藏:4329字,全部文档内容请下载后查看。喜欢就下载吧 ……

Android 深入浅出之Zygote.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1581471.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)