Android系统启动流程(二)解析Zygote进程启动过程

本文详细解析了Android系统中Zygote进程的启动过程,包括其在创建DVM和应用程序进程中的作用,以及AppRuntime如何通过JNI调用ZygoteInit的main函数。重点介绍了Zygote的Java框架层,如预加载类和资源、启动SystemServer进程和注册Socket等待请求的过程。
摘要由CSDN通过智能技术生成

1.Zygote简介

2.AppRuntime分析

3.Zygote的Java框架层

4.Zygote进程总结


前言

上一篇文章我们分析了init进程的启动过程,启动过程中主要做了三件事,其中一件就是创建了Zygote进程,那么Zygote进程是什么,它做了哪些事呢?这篇文章会给你这些问题的答案。

1.Zygote简介

在Android系统中,DVM(Dalvik虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fork

(复制进程)的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动时会创建DVM,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM的实例拷贝。

关于init启动zygote我们在上一篇文章已经提到了,这里就不赘述了,这篇文章主要分析Android7.0 Zygote的启动流程。

2.AppRuntime分析

我们从上篇文章得知init启动zygote时主要是调用app_main.cpp的main函数中的AppRuntime的start来启动zygote进程的,我们就从app_main.cpp的main函数开始分析,如下所示。

frameworks/base/cmds/app_process/app_main.cpp

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

{

AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));

Vector args;

if (!className.isEmpty()) {

args.add(application ? String8(“application”) : String8(“tool”));

runtime.setClassNameAndArgs(className, argc - i, argv + i);

} else {

// We’re in zygote mode.

maybeCreateDalvikCache();

if (startSystemServer) {

args.add(String8(“start-system-server”));//1

}

char prop[PROP_VALUE_MAX];

if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {

LOG_ALWAYS_FATAL(“app_process: Unable to determine ABI list from property %s.”,

ABI_LIST_PROPERTY);

return 11;

}

String8 abiFlag(“–abi-list=”);

abiFlag.append(prop);

args.add(abiFlag);

for (; i < argc; ++i) {

args.add(String8(argv[i]));

}

}

if (!niceName.isEmpty()) {

runtime.setArgv0(niceName.string());

set_process_name(niceName.string());

}

if (zygote)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值