日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android art虚拟机安装,Android中art虚拟机启动流程

發布時間:2024/9/19 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android art虚拟机安装,Android中art虚拟机启动流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文基于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函數的注釋

/*

* Start the Android runtime. This involves starting the virtual machine

* and calling the "static void main(String[] args)" method in the class

* named by "className".

*

* Passes the main function two arguments, the class name and the specified

* options string.

*

* 翻譯:

* 啟動Android運行時,包括啟動虛擬機,調用className參數對應的main函數

*/

1

2

3

4

5

6

7

8

9

10

11

/*

* Start the Android runtime.??This involves starting the virtual machine

* and calling the "static void main(String[] args)" method in the class

* named by "className".

*

* Passes the main function two arguments, the class name and the specified

* options string.

*

* 翻譯:

* 啟動Android運行時,包括啟動虛擬機,調用className參數對應的main函數

*/

start函數中的這段代碼切入到了startVm函數中

C++

/* start the virtual machine */

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

/* start the virtual machine */

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)

打賞

微信掃一掃,打賞作者吧~

總結

以上是生活随笔為你收集整理的android art虚拟机安装,Android中art虚拟机启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。