Android 深入浅出之Zygote
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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教学研究]2012西拉科学校团少队工作总结
- [教学研究]建筑工程公司档案管理制度
- [教学研究]小学数学人教版六年级上册圆的周长和面
- [教学研究]ERP电子行业解决方案
- [教学研究]钢支撑租赁合同范本
- [教学研究]预应力自动张拉系统用户手册Rev1.0
- [教学研究]MOOC课程:金瓶梅人物写真(每章节课后
- [教学研究]追加被执行人申请书(适用追加夫妻关系)
- [教学研究]2014年驾考科目一考试最新题库766
- [教学研究]2013-2014学年度九年级物理第15章《电
- [教学研究]新版中日交流标准日本语初级下26课-客
- [教学研究]小导管注浆施工作业指导书
- [教学研究]一般财务人员能力及人岗匹配评估表
- [教学研究]打1.2.页 小学一年级暑假口算100以内加
- [教学研究]学习贯彻《中国共产党党和国家机关基层
- [教学研究]2012年呼和浩特市中考试卷_35412
- [教学研究]最简易的电线电缆购销合同范本
- [教学研究]如何开展安全标准化建设
- [教学研究]工作分析与人岗匹配
- [教学研究]2016-2017学年高中历史第七单元现代中
- 山东省义务教育必修地方课程小学三年级
- 台湾宜兰大学互联网交换技术课程 01_In
- 思想品德:第一课《我知我家》课件(人
- SAR合成孔径雷达图像点目标仿真报告(附
- 利辛县“十三五”规划研究报告
- 2015-2020年中国手机APP行业市场发展趋
- 广告策略、创意表现、媒体方案
- 企业如何申请专利的的几点思考
- 《中国教育简史》网上作业
- 高中历史第二单元西方人文精神的起源及
- 年终晚会必备_精彩的主持稿_精心整理_
- 信息工程专业自荐书
- 2019高考历史人教版一轮练习:第十二单
- JAVA俱乐部管理系统软件需求规格说明书
- 2016-2021年中国小型板料折弯机行业市
- (人教新课标)六上_比的基本性质课件PPT
- 辽宁省公务员考试网申论备考技巧:名言
- 神经阻滞麻醉知情同意书
- 施工企业信息填报、审核和发布的相关事
- 初一(七年级)英语完形填空100篇




