谈谈对Android中Zygote的理解

Zygote的启动过程

  • Zygote进程在Init进程启动过程中被以service服务的形式启动:

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

class main

socket zygote stream 660 root system

  • 调用app_main.cpp的main函数中的AppRuntime的start方法来启动Zygote进程

  • 调用startVm函数来创建虚拟机,调用startReg函数为java虚拟机注册JNI方法

  • 通过toSlashClassName找到ZygoteInit,通过GetStaticMethedID函数找到main方法然后调用,ZygoteInit的main方法是由Java语言编写的,当前的运行逻辑在Native中,这就需要JNI来调用Java,这样Zygote就从Native层进入了Java框架层。

  • ZygoteInit的main方法的源码如下:

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

public static void main(String argv[]) {

//1、创建ZygoteServer

ZygoteServer zygoteServer = new ZygoteServer();

try {

boolean startSystemServer = false;

String socketName = “zygote”;

String abiList = null;

boolean enableLazyPreload = false;

// 2、解析app_main.cpp传来的参数

for (int i = 1; i < argv.length; i++) {

if (“start-system-server”.equals(argv[i])) {

startSystemServer = true;

} else if (“–enable-lazy-preload”.equals(argv[i])) {

enableLazyPreload = true;

} else if (argv[i].startsWith(ABI_LIST_ARG)) {

abiList = argv[i].substring(ABI_LIST_ARG.length());

} else if (argv[i].startsWith(SOCKET_NAME_ARG)) {

socketName = argv[i].substring(SOCKET_NAME_ARG.length());

} else {

throw new RuntimeException("Unknown command line argument: " + argv[I]);

}

}

if (abiList == null) {

throw new RuntimeException(“No ABI list supplied.”);

}

//3、创建一个Server端的Socket

zygoteServer.registerServerSocket(socketName);

// In some configurations, we avoid preloading resources and classes eagerly.

// In such cases, we will preload things prior to our first fork.

if (!enableLazyPreload) {

bootTimingsTraceLog.traceBegin(“ZygotePreload”);

EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,

SystemClock.uptimeMillis());

//4、加载进程的资源和类

preload(bootTimingsTraceLog);

EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,

SystemClock.uptimeMillis());

bootTimingsTraceLog.traceEnd(); // ZygotePreload

} else {

Zygote.resetNicePriority();

}

if (startSystemServer) {

//5、开启SystemServer进程,这是受精卵进程的第一次分裂

startSystemServer(abiList, socketName, zygoteServer);

}

Log.i(TAG, “Accepting command socket connections”);

//6、启动一个死循环监听来自Client端的消息

zygoteServer.runSelectLoop(abiList);

//7、关闭SystemServer的Socket

zygoteServer.closeServerSocket();

} catch (Zygote.MethodAndArgsCaller caller) {

//8、这里捕获这个异常调用MethodAndArgsCaller的run方法。

caller.run();

} catch (Throwable ex) {

Log.e(TAG, “System zygote died with exception”, ex);

zygoteServer.closeServerSocket();

throw ex;

}

}

总结下来的流程:

【1】通过registerServerSocket方法来创建一个Server端的socket,这个name为zygote的socket用于等待ActivityManagerService请求Zygote来创建新的应用程序进程

文末

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊

小编将自己6年以来的面试经验和学习笔记都整理成了一个**937页的PDF,**以及我学习进阶过程中看过的一些优质视频教程。

其实看到身边很多朋友抱怨自己的工资很低,包括笔者也是一样的,其原因是在面试过程中没有给面试官一个很好的答案。所以笔者会持续更新面试过程中遇到的问题,也希望大家和笔者一起进步,一起学习。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值