Dalvik类加载机制

在Windows程序执行时,CPU将程序的指令和数据加载到内存执行。相似的,Android程序执行时,要将程序的指令和数据加载到虚拟机的运行时环境。

Android的apk程序本质是一个压缩包,里面包含了classes.dex可执行文件,AndroidManifest.xml配置文件和资源文件等,将任意hello.apk修改为hello.zip解压就能看到。这和在Windows下将.doc的word文档修改为.zip解压类似。

Dalvik虚拟机的类加载机制,其输入就是apk中的dex文件,其输出是一个运行时环境中的ClassObject结构体,类加载就是将dex中类的各项资源数据与ClassObject结构体下的各个成员变量以指针的形式进行关联。

下面看一下类加载机制的工作流程。

  • dex文件校验及优化

验证的目的是对dex文件中的类数据进行安全性、合法性校验,为虚拟机的安全稳定运行提供保证。优化的目的是根据特定平台特性,优化dex文件并输出优化后的odex文件,提高程序运行效率。

  • 对优化后的odex文件进行解析

其目的是在内存中创建专用的数据结构来描述odex文件,使虚拟机对odex文件中的各个部分的类数据都是可到达的,为随后的加载某一个类做准备。注意,这个时候只是完成了对odex文件的解析且保存到了内存,但此时odex文件尚未加载到Dalvik虚拟机运行时环境。

  • 加载指定类

根据Dalvik虚拟机执行需要,从已被解析的odex文件中提取二进制Dalvik字节码,并将其封装进运行时数据结构,以供解释器执行。该运行时数据结构就是一个ClassObject结构体对象,也称类对象。

值得注意的是,dex的校验和优化在Android Dalvik虚拟机中被设计为独立的功能模块,Android系统新建一个虚拟机专门用于dex文件校验和优化,并在功能结束时释放虚拟机资源。这种设计很符合UNIX中只做一件事情,把它做好的设计哲学。

从odex的文件结构可以看出,它比dex文件多出3部分,其中最重要的工作体现在依赖库信息和类索引信息两部分上,通过这两部分附加数据,Dalvik虚拟机可以更快速的找到dex中依赖库和类的信息,提高程序执行效率。

在后面的表述中,我们把优化过的odex文件亦称为dex文件。dex文件在完成校验和优化后,下面的步骤就是进行解析。通过dex文件解析,在内存中生成DexFile结构体的一个实例,其结构体成员与dex文件格式中的数据元是一一对应的关系,即dex文件在内存中的表现。

类的加载的过程就是从内存中读取DexFile结构,并把对应类加载到Dalvik虚拟机中形成ClassObject的结构对象。ClassObject的成员变量基本上包含了目标类在运行期间所需要用到的全部资源。虚拟机在获取一个类加载指令后,首先确定加载类所属的Dex文件,然后在全局变量中查看虚拟机是否已经完成了对此Dex文件的解析。如果已经完成类的解析,则返回该Dex文件所对应的DexFile数据结构,再根据欲加载类的描述符在DexClassLookup哈希表中查找获取目标类的各个部分数据地址,(上图的第3部分类索引信息画的有些问题,正确的是每个类都有这样一个结构。)当得到Dex文件中相关类数据的存储地址后,将通过调用相关的加载函数对指定的各个类信息进行解析并加载,使之以ClassObject类型的数据结构存储于运行时环境中,并为解释器的执行提供相应类方法的字节码。

当虚拟机完成类的加载后,解释器会对加载的代码进行检查,验证是否符合虚拟机的执行规范,最后调用dvmInterpret函数进行解释器初始化并开始执行字节码。dvmInterpret函数有一段关键代码。

/* 初始化解释器工作环境 */

self->interpSave.method = method;

self->interpSave.curFrame = (u4*) self->interpSave.curFrame;

self->interpSave.pc = method.insns;

这个执行进程self首先取得了将要执行方法的method指针,随后在第3行代码中将method->insns可执行代码区的首地址赋值给了执行进程的pc指针的self->interpSave.pc,随后解释器的pc指针将会逐一读入指令并执行相关字节码。

时间: 2024-09-29 22:06:27

Dalvik类加载机制的相关文章

热修复之类加载机制总结

扩展:了解JVM中的类加载机制 及双亲委托模式,之后你会发现Android的ClassLoader与Java中的不同之处,因着前者加载的是dex文件,并非是class字节码文件,再去学习dex相关概念知识, Android类加载介绍?Android中的ClassLoader类加载机制主要用来加载dex文件,系统提供了PathClassLoader.DexClassLoader两个API可供选择.ClassLoader种类如下:BootClassLoader,BaseDexClassLoader:

深入理解Java:类加载机制及反射

一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能. 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 2.工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地

JVM类加载机制详解(一)JVM类加载过程

首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值? 5.类加载器是什么? 6.如何编写一个自定义的类加载器? 首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数

类加载机制及反射

http://www.cnblogs.com/ITtangtang/p/3978102.html 一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能. 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这

JVM 类加载机制详解

原文出处: ziwenxie 如下图所示,JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口.注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类). 验证

Java基础加强——类加载机制

什么叫类加载 JVM把 .class 字节码文件加载到内存,并进行相关的校验.解析.初始化,最终转换为虚拟机可用的JAVA类型的过程,称为JVM类加载机制. (当然,JVM并不关心class文件的来源,什么?什么叫class文件?--每一个Java class文件都对一个Java类或者Java接口做出了全面描述) 类加载器的分类 启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面的核心类库或-Xbootcla

浅谈JVM-图解类加载机制

一.目录 二.类加载机制流程 1.什么是类加载机制? JVM把class文件加载到内存里面,并对数据进行校验.准备.解析和初始化,最终能够被形成被JVM可以直接使用的Java类型的过程. 2.类加载流程图 3.加载 将class文件加载在内存中. 将静态数据结构(数据存在于class文件的结构)转化成方法区中运行时的数据结构(数据存在于JVM时的数据结构). 在堆中生成一个代表这个类的java.lang.Class对象,作为数据访问的入口. 4.链接 链接就是将Java类的二进制代码合并到jav

Java虚拟机类加载机制

原文出处: 朱小厮 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的.随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性.闲话不多说,老规矩,先来一段代码吊吊胃口. 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 37 38 39 40 41 42 public cla