Android插件化基础篇 — dex 文件

Android插件化基础篇 — dex 文件

什么是 dex 文件

dex 文件和 class 文件一样,也是一种文件格式,相对的,dex 文件就是能够被 DVM 识别,加载并执行的文件格式。同样的,dex 不一定只能通过 java 来生成,也可以用 C 和 C++ 来生成,所以,Android 程序也可以通过这些语言来写。

如何生成 dex 文件

和 class 文件一样,dex 文件可以通过高级的 IDE 来帮助我们生成,使用 Eclipse 或者 Android Studio 的时候,当我们点击 Run 按钮的时候,IDE 就会帮我们在 build 文件夹下生成一个 apk ,解压了 apk 后,我们就能看到 dex 文件。

当然,我们也可以通过命令 「dx」来生成 dex 文件,实际上上面说的那些 IDE 生成 dex 文件的原理就是通过 dx 命令。

生成了 dex 文件后,我们可以通过 Push 命令将 dex 文件传输到手机的指定目录中,再通过以下命令完成手动在手机执行 dex 文件,比如我要将当前终端所在目录下的Test.class文件生成为 Test.dex 文件,并最终推送到手机上执行,我将会在终端中输入以下命令:

dx --dex --output Test.dex Test.class //生成 Test.dex 文件
adb push Hello.dex /storage/emulated/0 //将生成好的 dex 文件推送到指定目录中,目录自定义
adb shell   //登入到手机控制台中
dalvikvm -cp /sdcard/Test.dex Test  //执行 Test.dex 文件中的 Test 类

实际上各种开发工具的内部原理都是一样的,都得生成 dex 文件,然后通过 push 推送到手机上,所以我们在开发工具上调试的时候必须要连接 USB,就是为了方便它的 push 操作。

dex 文件与 class 文件的对比

dex 文件用来记录整个工程中所有类文件的信息,它和 class 文件最大的区别也是最大的优势就在于,class 文件只记录一个类的所有信息,而 dex 文件将会把工程中所有的类文件信息都记录在一起。

当类文件越来越多的情况下,dex 文件的优势就显示出来了,它只需要把这些信息集中记录到一个 dex 文件上,这样很多区域就会被复用,极大的减少了 dex 文件的大小。

当他们本质上是一样的,dex 也是从 class 文件演变而来的。class 文件有一些冗余数据,dex 将会优化这些信息,去除冗余,最终完成信息的整合。

dex 文件格式解析

dex 文件和 class 文件一样,也是一种 8 位字节的二进制流文件,并且各个数据按顺序紧密排列,没有间隙,减少了文件体积。
与 class 文件不同的就是上面所说的,在不考虑 Android MultiDex 技术情况下,一个 dex 文件包含了整个应用所有 java 源文件。

dex 文件格式
dex 文件格式

dex 文件有三个部分:文件头、索引区、数据区
文件头 head 主要记录了 dex 文件的信息以及所有字段大致的数据分布。
索引区包括了字符串、类型、方法原型、域和方法的索引,定义了整个 dex 文件中这些东西的内容和存储位置,这些索引区的内容最终又被存储到了数据区
数据区中,最后的 link_data 链接数据区存储了 Android 中 so 文件的引用指向。

文件头的字段和 class 文件字段有一定的相似,具体的字段描述在下图中有具体阐述,不作特别的说明了,单独强调下前三个字段和中间的 mapOff 字段都有校验的作用。

文件头字段
文件头字段

dex 文件的解析就到这里结束了,实际上我省略了 dex 文件索引区和数据区的字段解析,实际上就是对应了 head 文件的那些字段进行更为详细的具体记录,有兴趣的同学可以使用 010 Editor 软件解析一个 dex 文件,亲自看看文件结构。

下一篇将讲述「虚拟机」相关的知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值