您的位置:首页 > 移动开发 > Android开发

Android培训班(83)Dalvik虚拟机的初始化

2011-12-10 22:29 211 查看
现在开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作。dvmAllocTrackerStartup函数初始化跟踪显示系统,跟踪系统主要用生成调试系统的数据包。dvmGcStartup函数是用来初始化垃圾回收器。dvmThreadStartup函数是初始化线程列表和主线程环境参数。dvmInlineNativeStartup函数是分配内部操作方法的表格内存。dvmVerificationStartup函数是初始化虚拟机的指令码相关的内容,以便检查指令是否正确。dvmRegisterMapStartup函数是分配指令寄存器状态的内存。dvmInstanceofStartup函数是分配虚拟机使用的缓存。dvmClassStartup函数是初始化虚拟机最基本用的J***A库。dvmThreadObjStartup函数是初始化虚拟机进一步使用的J***A类库线程类。dvmExceptionStartup函数是初始化虚拟机使用的异常J***A类库。dvmStringInternStartup函数是初始化虚拟机解释器使用的字符串哈希表。dvmNativeStartup函数是初始化本地方法库的表。dvmInternalNativeStartup函数是初始化内部本地方法,建立哈希表,方便快速查找到。dvmJniStartup函数是初始化JNI调用表,以便快速找到本地方法调用的入口。dvmReflectStartup函数是缓存J***A类库里的反射类。
接着把下面这些类先进行初始化,如下:staticconst char*earlyClasses[] = { "Ljava/lang/InternalError;", "Ljava/lang/StackOverflowError;", "Ljava/lang/UnsatisfiedLinkError;", "Ljava/lang/NoClassDefFoundError;", NULL };初始化这些类,就是调用函数dvmFindSystemClassNoInit来初始化。
接着调用dvmValidateBoxClasses函数来初始化J***A基本类型库,如下: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来注册J***A库里的JNI方法;调用dvmCreateStockExceptions函数分配异常出错的内存;调用dvmPrepMainThread函数完成解释器主线程的初始化;调用dvmDebuggerStartup函数进行调试器的初始化;最后调用dvmInitZygote或者dvmInitAfterZygote来初始化线程的模式,调用dvmCheckException函数检查是否有异常情况出现。
到这里就把整个虚拟机初始化流程完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: