Android(java)学习笔记159:Dalivk虚拟机的初始化过程
2015-08-15 09:47
666 查看
1.[b]初始化下面系统函数(调用[b]dvmStartup函数初始化所有相关的函数)
[/b][/b]
开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:
dvmAllocTrackerStartup函数初始化跟踪显示系统,跟踪系统主要用生成调试系统的数据包。
dvmGcStartup函数是用来初始化垃圾回收器。
dvmThreadStartup函数是初始化线程列表和主线程环境参数。
dvmInlineNativeStartup函数是分配内部操作方法的表格内存。
dvmVerificationStartup函数是初始化虚拟机的指令码相关的内容,以便检查指令是否正确。
dvmRegisterMapStartup函数是分配指令寄存器状态的内存。
dvmInstanceofStartup函数是分配虚拟机使用的缓存。
dvmClassStartup函数是初始化虚拟机最基本用的JAVA库。
dvmThreadObjStartup函数是初始化虚拟机进一步使用的JAVA类库线程类。
dvmExceptionStartup函数是初始化虚拟机使用的异常JAVA类库。
dvmStringInternStartup函数是初始化虚拟机解释器使用的字符串哈希表。
dvmNativeStartup函数是初始化本地方法库的表。
dvmInternalNativeStartup函数是初始化内部本地方法,建立哈希表,方便快速查找到。
dvmJniStartup函数是初始化JNI调用表,以便快速找到本地方法调用的入口。
dvmReflectStartup函数是缓存JAVA类库里的反射类。
2.上面初始化函数处理之后,接着把下面这些类先进行初始化,如下:
staticconst char*earlyClasses[] = {
"Ljava/lang/InternalError;",
"Ljava/lang/StackOverflowError;",
"Ljava/lang/UnsatisfiedLinkError;",
"Ljava/lang/NoClassDefFoundError;",
NULL
};
初始化这些类,就是调用函数dvmFindSystemClassNoInit来初始化。
3.接着调用dvmValidateBoxClasses函数来初始化JAVA基本类型库,如下:
staticconstchar*classes[] = {
"Ljava/lang/Boolean;",
"Ljava/lang/Character;",
"Ljava/lang/Float;",
"Ljava/lang/Double;",
"Ljava/lang/Byte;",
"Ljava/lang/Short;",
"Ljava/lang/Integer;",
"Ljava/lang/Long;",
NULL
};
备注:这些类调用函数(刚刚使用的[b]dvmFindSystemClassNoInit、[b]dvmValidateBoxClasses等)[/b],不是上面使用系统函数来初始化,而是调用dvmFindClassNoInit来初始化。[/b]
4.调用dvmPrepMainForJni[b]类调用函数准备主线程里的解释栈可以调用JNI的方法;[/b]
调用registerSystemNatives[b]类调用函数来注册JAVA库里的JNI方法;[/b]
调用dvmCreateStockExceptions[b]类调用函数分配异常出错的内存;[/b]
调用dvmPrepMainThread[b]类调用函数完成解释器主线程的初始化;[/b]
调用dvmDebuggerStartup[b]类调用函数进行调试器的初始化;[/b]
最后调用dvmInitZygote[b]类调用函数或者dvmInitAfterZygote类调用函数来初始化线程的模式,调用dvmCheckException函数检查是否有异常情况出现。[/b]
6.到这里就把整个虚拟机初始化流程完成。
[/b][/b]
开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:
dvmAllocTrackerStartup函数初始化跟踪显示系统,跟踪系统主要用生成调试系统的数据包。
dvmGcStartup函数是用来初始化垃圾回收器。
dvmThreadStartup函数是初始化线程列表和主线程环境参数。
dvmInlineNativeStartup函数是分配内部操作方法的表格内存。
dvmVerificationStartup函数是初始化虚拟机的指令码相关的内容,以便检查指令是否正确。
dvmRegisterMapStartup函数是分配指令寄存器状态的内存。
dvmInstanceofStartup函数是分配虚拟机使用的缓存。
dvmClassStartup函数是初始化虚拟机最基本用的JAVA库。
dvmThreadObjStartup函数是初始化虚拟机进一步使用的JAVA类库线程类。
dvmExceptionStartup函数是初始化虚拟机使用的异常JAVA类库。
dvmStringInternStartup函数是初始化虚拟机解释器使用的字符串哈希表。
dvmNativeStartup函数是初始化本地方法库的表。
dvmInternalNativeStartup函数是初始化内部本地方法,建立哈希表,方便快速查找到。
dvmJniStartup函数是初始化JNI调用表,以便快速找到本地方法调用的入口。
dvmReflectStartup函数是缓存JAVA类库里的反射类。
2.上面初始化函数处理之后,接着把下面这些类先进行初始化,如下:
staticconst char*earlyClasses[] = {
"Ljava/lang/InternalError;",
"Ljava/lang/StackOverflowError;",
"Ljava/lang/UnsatisfiedLinkError;",
"Ljava/lang/NoClassDefFoundError;",
NULL
};
初始化这些类,就是调用函数dvmFindSystemClassNoInit来初始化。
3.接着调用dvmValidateBoxClasses函数来初始化JAVA基本类型库,如下:
staticconstchar*classes[] = {
"Ljava/lang/Boolean;",
"Ljava/lang/Character;",
"Ljava/lang/Float;",
"Ljava/lang/Double;",
"Ljava/lang/Byte;",
"Ljava/lang/Short;",
"Ljava/lang/Integer;",
"Ljava/lang/Long;",
NULL
};
备注:这些类调用函数(刚刚使用的[b]dvmFindSystemClassNoInit、[b]dvmValidateBoxClasses等)[/b],不是上面使用系统函数来初始化,而是调用dvmFindClassNoInit来初始化。[/b]
4.调用dvmPrepMainForJni[b]类调用函数准备主线程里的解释栈可以调用JNI的方法;[/b]
调用registerSystemNatives[b]类调用函数来注册JAVA库里的JNI方法;[/b]
调用dvmCreateStockExceptions[b]类调用函数分配异常出错的内存;[/b]
调用dvmPrepMainThread[b]类调用函数完成解释器主线程的初始化;[/b]
调用dvmDebuggerStartup[b]类调用函数进行调试器的初始化;[/b]
最后调用dvmInitZygote[b]类调用函数或者dvmInitAfterZygote类调用函数来初始化线程的模式,调用dvmCheckException函数检查是否有异常情况出现。[/b]
6.到这里就把整个虚拟机初始化流程完成。
相关文章推荐
- Android Material Design控件学习(一)——TabLayout的用法
- Android实现图片高斯模糊
- android launcher source code解析
- android adb详解
- Android(java)学习笔记158:Java程序入口和Android的APK入口
- android apk文件安装
- android.os.NetworkOnMainThreadException 解决办 4000 法
- Android开发使用Viewpager实现程序引导界面
- Android pm命令用法
- Android屏幕适配全攻略(最权威的官方适配指导)
- 深入理解Android系列书籍资源分享更新
- Android 聊天表情输入、表情翻页带效果、下拉刷新聊天记录
- 在Android上使用Google V8 JS 引擎
- 在Android上使用Google V8 JS 引擎
- 第一个Android程序——计算器
- android:layout_weight详解
- 改变Android ProgressBar样式颜色
- android登录Web以及登录保持,cookie管理相关
- 解决Android Studio的ADB not responding错误
- 简单的android选项卡Tab菜单TabHost(一)同一Activity上实现