Android插件化基础篇 — dex 文件

来源:互联网 发布:运营商网络监控软件 编辑:程序博客网 时间:2024/05/22 07:44

有关插件化系列的其他文章链接在下面已列出,将会不断更新,希望各位追踪关注~

  • Android插件化基础篇–class 文件
  • 插件化踩坑之路–Small和Atlas方案对比

上一篇文章介绍了很多 class 文件相关的知识,这篇我们将具体的剖析一下 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 文件有三个部分:文件头、索引区、数据区
文件头 head 主要记录了 dex 文件的信息以及所有字段大致的数据分布。
索引区包括了字符串、类型、方法原型、域和方法的索引,定义了整个 dex 文件中这些东西的内容和存储位置,这些索引区的内容最终又被存储到了数据区
数据区中,最后的 link_data 链接数据区存储了 Android 中 so 文件的引用指向。

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

文件头字段

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

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

本文部分内容参考于慕课网实战课程「Android 应用发展趋势必备武器 热修复与插件化」,有兴趣的朋友可以付费学习。
插件化实战课程

原创粉丝点击