现在开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作。

dvmAllocTrackerStartup函数初始化跟踪显示系统,跟踪系统主要用生成调试系统的数据包。

dvmGcStartup函数是用来初始化垃圾回收器。

dvmThreadStartup函数是初始化线程列表和主线程环境参数。

dvmInlineNativeStartup函数是分配内部操作方法的表格内存。

dvmVerificationStartup函数是初始化虚拟机的指令码相关的内容,以便检查指令是否正确。

dvmRegisterMapStartup函数是分配指令寄存器状态的内存。

dvmInstanceofStartup函数是分配虚拟机使用的缓存。

dvmClassStartup函数是初始化虚拟机最基本用的JAVA库。

dvmThreadObjStartup函数是初始化虚拟机进一步使用的JAVA类库线程类。

dvmExceptionStartup函数是初始化虚拟机使用的异常JAVA类库。

dvmStringInternStartup函数是初始化虚拟机解释器使用的字符串哈希表。

dvmNativeStartup函数是初始化本地方法库的表。

dvmInternalNativeStartup函数是初始化内部本地方法,建立哈希表,方便快速查找到。

dvmJniStartup函数是初始化JNI调用表,以便快速找到本地方法调用的入口。

dvmReflectStartup函数是缓存JAVA类库里的反射类。


接着把下面这些类先进行初始化,如下:

staticconst char*earlyClasses[] = {

"Ljava/lang/InternalError;",

"Ljava/lang/StackOverflowError;",

"Ljava/lang/UnsatisfiedLinkError;",

"Ljava/lang/NoClassDefFoundError;",

NULL

};

初始化这些类,就是调用函数dvmFindSystemClassNoInit来初始化


接着调用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

};

这些类调用函数,不是上面使用系统函数来初始化,而是调用dvmFindClassNoInit来初始化。


调用dvmPrepMainForJni函数准备主线程里的解释栈可以调用JNI的方法;调用registerSystemNatives来注册JAVA库里的JNI方法;调用dvmCreateStockExceptions函数分配异常出错的内存;调用dvmPrepMainThread函数完成解释器主线程的初始化;调用dvmDebuggerStartup函数进行调试器的初始化;

最后调用dvmInitZygote或者dvmInitAfterZygote来初始化线程的模式,调用dvmCheckException函数检查是否有异常情况出现。


到这里就把整个虚拟机初始化流程完成。

更多相关文章

  1. Message Looper Handler三者之间的关联
  2. Android(安卓)Zygote源码分析
  3. Android的onMeasure和onLayout And MeasureSpec揭秘
  4. Android菜鸟的成长笔记——初识Activity
  5. Android培训班(84)Dalvik虚拟机的JNI测试函数
  6. android(NDK+JNI)---JNI全面解析
  7. Android(安卓)Kotlin ARouter组件化构建项目
  8. Android实现调用震动的方法
  9. 【Android开发进阶系列,整理】Android与h5交互专题

随机推荐

  1. Linux 删除文件夹和文件的命令
  2. 嵌入式Linux要学哪些东西?你真的造吗?
  3. gdb学习(二)[第二版]
  4. Linux命令备忘实例(10)——目录管理
  5. linux下安装weblogic无图形化界面
  6. 鸟哥的linux私房菜学习笔记《三十九》Lin
  7. linux进程和线程排查 · 记一次JVM CPU高
  8. Linux服务器禁用ping
  9. linux 中 开放端口,以及防火墙的相关命令
  10. linux下如何杀掉D状态进程