安卓系统中的.dex文件是什么?

230

我有关于 dex 文件 的一些问题

  • dex 文件在 Android 中是什么?
  • dex 在 Android 中是如何工作的?
  • dex 在调试 Android 应用时如何使用?
  • dex 文件和 java 类文件类似吗?

请提供具体的信息,欢迎提供任何实际示例!


请查看此链接:https://dev59.com/knM_5IYBdhLWcg3wvF3J - Gensheriff
如何在设备上运行它们:https://dev59.com/hmkw5IYBdhLWcg3wBV3j - Ciro Santilli OurBigBook.com
是的,从某个方面来说,它们类似于Java的.class文件。Java虚拟机解释.class文件,而Delvik虚拟机或Android运行时解释.dex文件。 - fflores
3个回答

271

关于 .dex 文件:

Dalvik 虚拟机(Android 系统中的核心)最显著的特点之一是它不使用 Java 字节码。相反,使用了一种自定义格式称为 DEX,即使字节码指令也与 Java 字节码指令不同。

编译后的 Android 应用代码文件

Android 程序被编译成 .dex(Dalvik 可执行)文件,然后在设备上被压缩为单个 .apk 文件。 .dex 文件可以通过自动翻译使用 Java 编程语言编写的已编译应用程序来创建。

Dex 文件格式:

  1. 文件头
  2. 字符串表
  3. 类列表
  4. 字段表
  5. 方法表
  6. 类定义表
  7. 字段列表
  8. 方法列表
  9. 代码头
  10. 本地变量列表

Android 对 DVM 可执行格式(.dex 文件)有文档说明。您可以在官方文档页面找到更多信息:Dex 文件格式

.dex 文件类似于 Java 类文件,但在旧版 Android 上在 Dalvik 虚拟机(DVM)下运行,并且在新版 Android 上在设备上安装时使用 ART 编译为本机代码。

您可以使用提供在 android-sdk 中的 dexdump 工具来反编译 .dex 文件。

还有一些反向工程技术可用于将 .dex 文件制作成 jar 文件java 类文件


我的jar文件包含assets文件夹中的一些xml。我希望它成为.dex的一部分。有什么实现方法吗? - AndroidGuy
@AndroidGuy - Jar文件不包含任何Android资源包(/asset),你必须使用Android库包来解决这个问题。 - user370305
在Android Lollipop上,ART是如何工作的?使用哪些文件以及在哪个路径下?有人说它会占用更多的空间。这是真的吗?如果是,为什么呢?我的意思是,本地代码似乎总是比字节码小得多,而dex文件在工作方式上类似于字节码。 - android developer
1
需要注意的一件重要事情是,dexdump 不是反编译器而是反汇编器。 - genghiskhan

97

dex文件是在Dalvik虚拟机上执行的文件。

Dalvik VM包含多项性能优化、验证和监控功能,其中之一是Dalvik Executable (DEX)

Java源代码由Java编译器编译成.class文件。然后,Android SDK的dx(dexer)工具会处理.class文件,将其转换为名为DEX的文件格式,其中包含Dalvik字节码。dx工具会删除类中存在的所有冗余信息。在DEX中,应用程序的所有类都被打包到一个文件中。以下表格比较了JVM jar文件和dex工具处理的文件的代码大小。

该表格比较了系统库、Web浏览器应用程序和通用目的应用程序(闹钟应用程序)的代码大小。在所有情况下,dex工具将代码大小减少了50%以上。

enter image description here

在标准的Java环境中,Java代码中的每个类都会生成一个.class文件。这意味着,如果Java源代码文件有一个公共类和两个匿名类(例如用于事件处理),则Java编译器将总共创建三个.class文件。

在Android平台上,编译步骤是相同的,因此会生成多个.class文件。但是,在生成.class文件之后,使用“dx”工具将所有.class文件转换为单个.dex或Dalvik Executable文件。执行的是.dex文件。.dex文件已经针对内存使用进行了优化,其设计主要由数据共享驱动。


21
好的信息。只有一件事要指出。有时会因为方法调用指令数量限制而产生多个 dex 文件。此限制为 65k 方法。在这种情况下,您的代码将不在一个文件中,而是在 2 个或更多文件中,但其余部分仍然适用。另外,由于动态类加载也可用,因此您可以从文件中加载代码(再次以 dex 形式),因此代码将位于多个 dex 文件中。 - Igor Čordaš

94
.dex file

已编译的Android应用程序代码文件。

Android程序被编译成.dex(Dalvik可执行)文件,然后在设备上压缩成单个.apk文件。.dex文件可以被Android自动创建,通过将用Java编写的已编译应用程序进行翻译。


2
我的jar文件包含assets文件夹中的一些xml。我希望它成为.dex的一部分。有什么实现方法吗? - AndroidGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接