本文主要描述了Dalvik虚拟机中 Class 从加载到实例化过程。文中不贴代码,因为代码处理有些繁琐。将代码的操作过程全部抽象成图,理解起来更加直观。
1 Odex文件布局
- Java层创建ClassLoad并加载一个DexFile,Native层返回DexOrJar对象指针,表示 map 映射后的DexFile
- DexFile对象中保存了map 后的 Odex 文件索引信息,在解析odex文件中 Class 时候需通过该对象来获取 Class 的具体信息
2 类加载、链接、初始化
- 加载:dalvik虚拟机分配ClassObject结构体表示一个成功加载的类,并从OdexFile中解析 Class 的相关信息:接口,方法,成员变量,静态成员等。
- 链接:根据加载阶段获取到的类的成员信息进行链接操作,包括递归加载父类,实现的接口,并创建虚函数表,接口函数访问表,并调整实例成员的布局(为了对齐,紧凑),计算实例的大小。
- 初始化:初始化推迟到实例对象或者第一次使用类的静态成员才进行,包括验证类&#x