前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ODEX格式及生成过程

ODEX格式及生成过程

作者头像
用户2930595
发布2018-08-23 10:07:31
1.6K0
发布2018-08-23 10:07:31
举报

Apk在安装(installer)时,就会进行验证和优化,目的是为了校验代码合法性及优化代码执行速度,参见Dalvik Optimization and Verification Withdexopt

验证和优化后,会产生ODEX文件,运行Apk的时候,直接加载ODEX,避免重复验证和优化,加快了Apk的响应时间。

先来看一张ODEX文件的结构图:

ODEX文件的结构图

下面将围绕这张图,结合dexopt的代码,说明ODEX的生成过程。

一. 首先将一个空的DexOptHeader写入ODEX文件

代码语言:javascript
复制
dexOptCreateEmptyHeader(cacheFd)

二. 从Apk中提取classes.dex,追加到ODEX文件

代码语言:javascript
复制
dexZipExtractEntryToFile(&zippy, zipEntry, cacheFd)

此时文件结构是这样的:

三. 修改Dex内容

代码语言:javascript
复制
rewriteDex(((u1*) mapAddr) + dexOffset, dexLength, doVerify, doOpt, &pClassLookup, NULL)

这一步是验证和优化的核心,具体见:

代码语言:javascript
复制
verifyAndOptimizeClasses(pDvmDex->pDexFile, doVerify, doOpt)
... 
verifyAndOptimizeClass(pDexFile, clazz, pClassDef, doVerify, doOpt)
...
dvmVerifyClass(clazz)
...
dvmOptimizeClass(clazz, false)

其中dvmVerifyClass和dvmOptimizeClass都是针对类中的方法,具体做了哪些事情参考源码。

四. 因为3修改了Dex内容,所以要重新计算Dex的checksum

代码语言:javascript
复制
updateChecksum(dexAddr, dexLength, pHeader)

五. 往ODEX文件后面追加Dependenices内容

代码语言:javascript
复制
writeDependencies(fd, modWhen, crc)

所谓的Dependenicies,是指Dex文件之间的依赖,比如App会依赖于framework的Dex。当framework的Dex发生变化时,App的ODEX文件将失效,需要重新生成。 writeDependencies中将bootclasspath下的dex文件都加入到依赖中。 此时文件结构是这样的:

六. 将优化的其他内容追加到ODEX文件

代码语言:javascript
复制
writeOptData(fd, pClassLookup, pRegMapBuilder)

其中按照不同类型的内容,分为三个chunk写入:

代码语言:javascript
复制
writeChunk(fd, (u4) kDexChunkClassLookup, pClassLookup, pClassLookup->size)
writeChunk(fd, (u4) kDexChunkRegisterMaps,  pRegMapBuilder->data, pRegMapBuilder->size)
writeChunk(fd, (u4) kDexChunkEnd, NULL, 0)

此时的文件结构是这样的:

其中:

代码语言:javascript
复制
dexCreateClassLookup(pDvmDex->pDexFile)

此处根据Dex生成了pClassLookup,pClassLookup你可以简单理解为一张hash表,里面保存了classDescriptor到classDef的映射。

代码语言:javascript
复制
dvmGenerateRegisterMaps(pDvmDex)

此处根据DvmDex生成了RegisterMaps,RegisterMaps的作用是为了标记方法中寄存器引用的对象,在快速GC时,不会释放这些对象。具体参考Dalvik虚拟机中RegisterMap结构解析

七. 根据所有的内容,改写第一步中DexOptHeader的相关字段值。

至此,ODEX文件完整生成。

参考资料:

  1. Dalvik Optimization and Verification Withdexopt
  2. Android系统ODEX文件格式解析
  3. Dalvik虚拟机中RegisterMap结构解析
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档