本文基于Android8.1系统进行研究
一、启动zygote
在Linux内核启动完成后,首先启动系统的第一个进程init进程
init进程会读取init.rc中的配置文件
其中有Zygote的配置,init进程将启动zygote进程
zygote的入口在app_main.cpp中的main函数中
二、解析传入参数,调用AndroidRuntime的start方法
在app_main.cpp中的main函数中,首先解析传入的相关参数,并通过如下代码进入ZygoteInit的main函数中
Java
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}
1
2
3
if(zygote){
runtime.start("com.android.internal.os.ZygoteInit",args,zygote);
}
runtime是AppRuntime的一个实例,AppRuntim继承自AndroidRuntime
start函数定义在AndroidRuntime中,下面是start函数的注释
1
2
3
4
5
6
7
8
9
10
11
start函数中的这段代码切入到了startVm函数中
C++
JniInvocation jni_invocation;
jni_invocation.Init(NULL);
JNIEnv* env;
if (startVm(&mJavaVM, &env, zygote) != 0) {
return;
}
onVmCreated(env);
1
2
3
4
5
6
7
8
JniInvocationjni_invocation;
jni_invocation.Init(NULL);
JNIEnv*env;
if(startVm(&mJavaVM,&env,zygote)!=0){
return;
}
onVmCreated(env);
三、startVm函数
这个函数前边也是一堆处理Vm启动参数的逻辑
在函数的最好调用JNI_CreateJavaVM函数通过c++层的库创建虚拟机
四、JNI_CreateJavaVM函数
JNI_CreateJavaVM函数是在art/runtime/java_vm_ext.cc中实现的,代码如下:
C++
// JNI Invocation interface.
extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {
ScopedTrace trace(__FUNCTION__);
const JavaVMInitArgs* args = static_cast(vm_args);
if (JavaVMExt::IsBadJniVersion(args->version)) {
LOG(ERROR) << "Bad JNI version passed to CreateJavaVM: " << args->version;
return JNI_EVERSION;
}
RuntimeOptions options;
for (int i = 0; i < args->nOptions; ++i) {
JavaVMOption* option = &args->options[i];
options.push_back(std::make_pair(std::string(option->optionString), option->extraInfo));
}
bool ignore_unrecognized = args->ignoreUnrecognized;
if (!Runtime::Create(options, ignore_unrecognized)) {
return JNI_ERR;
}
// Initialize native loader. This step makes sure we have
// everything set up before we start using JNI.
android::InitializeNativeLoader();
Runtime* runtime = Runtime::Current();
bool started = runtime->Start();
if (!started) {
delete Thread::Current()->GetJniEnv();
delete runtime->GetJavaVM();
LOG(WARNING) << "CreateJavaVM failed";
return JNI_ERR;
}
*p_env = Thread::Current()->GetJniEnv();
*p_vm = runtime->GetJavaVM();
return JNI_OK;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// JNI Invocation interface.
extern"C"jintJNI_CreateJavaVM(JavaVM**p_vm,JNIEnv**p_env,void*vm_args){
ScopedTracetrace(__FUNCTION__);
constJavaVMInitArgs*args=static_cast(vm_args);
if(JavaVMExt::IsBadJniVersion(args->version)){
LOG(ERROR)<version;
returnJNI_EVERSION;
}
RuntimeOptionsoptions;
for(inti=0;inOptions;++i){
JavaVMOption*option=&args->options[i];
options.push_back(std::make_pair(std::string(option->optionString),option->extraInfo));
}
boolignore_unrecognized=args->ignoreUnrecognized;
if(!Runtime::Create(options,ignore_unrecognized)){
returnJNI_ERR;
}
// Initialize native loader. This step makes sure we have
// everything set up before we start using JNI.
android::InitializeNativeLoader();
Runtime*runtime=Runtime::Current();
boolstarted=runtime->Start();
if(!started){
deleteThread::Current()->GetJniEnv();
deleteruntime->GetJavaVM();
LOG(WARNING)<
returnJNI_ERR;
}
*p_env=Thread::Current()->GetJniEnv();
*p_vm=runtime->GetJavaVM();
returnJNI_OK;
}
Runtime是在art/runtime/runtime.h中定义的类
Runtime::Current()返回一个静态的Runtime实例,代码如下:
static Runtime* instance_;
1
staticRuntime*instance_;
runtime-Start()启动虚拟机
五、其他参考文章
Android ART运行时无缝替换Dalvik虚拟机的过程分析
Android虚拟机art流程:从zygote开始梳理art的启动(1)
打赏
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SYmhjMkdjY2ImM2MGOiZmY2YzNiFzM2UjYhJzN4kjNm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
微信扫一扫,打赏作者吧~