Mobile Development 13 min read

Article | Zhao Hengyu on Mobile

The article explains what a Dex file is, how it is produced from Java .class files via the dx tool after JVM compilation, and why understanding Dex is crucial for Android tasks such as APK slimming, hot‑fixes, plugin architecture, app hardening, reverse engineering and overcoming the 64K method limit.

Youzan Coder
Youzan Coder
Youzan Coder
Article | Zhao Hengyu on Mobile

概述

了解了 Dex 文件以后,对日常开发中遇到一些问题能有更深的理解。如:APK 的瘦身、热修复、插件化、应用加固、Android 逆向工程、64K 方法数限制。

什么是 Dex 文件

在明白什么是 Dex 文件之前,要先了解一下 JVM,Dalvik 和 ART。JVM 是 JAVA 虚拟机,用来运行JAVA字节码程序。Dalvik 是 Google 设计的用于 Android 平台的运行时环境,适合移动环境下内存和处理器速度有限的系统。ART 即 Android Runtime,是 Google 为了替换 Dalvik 设计的新 Android 运行时环境,在 Android4.4 推出。ART 比 Dalvik 的性能更好。Android 程序一般使用 Java 语言开发,但是 Dalvik 虚拟机并不支持直接执行 JAVA 字节码,所以会对编译生成的 .class 文件进行翻译、重构、解释、压缩等处理,这个处理过程是由 dx 进行处理,处理完成后生成的产物会以 .dex 结尾,称为 Dex 文件。Dex 文件格式是专为 Dalvik 设计的一种压缩格式。所以可以简单的理解为:Dex 文件是很多 .class 文件处理后的产物,最终可以在 Android 运行时环境执行。

Dex文件是怎么生成的

Java 代码转化为 Dex 文件的流程如图所示,当然真的处理流程不会这么简单,这里只是一个形象的显示:

现在来通过一个简单的例子实现 Java 代码到 Dex 文件的转化。

从.java到.class

先来创建一个 Hello.java 文件,为了便于分析,这里写一些简单的代码。代码如下:

public class Hello {

...

现在在当前目录下使用 JDK 的 javac 编译这个 java 文件。

javac Hello

javac 命令执行后会在当前目录生成 Hello.class 文件,Hello.class 文件已经可以直接在 JVM 虚拟机上直接执行。这里使用命令执行该文件。

java Hello

执行后应该会在控制台打印出“hello! youzan”

这里也可以对 Hello.class 文件执行 javap 命令,进行反汇编。

javap -c Hello

执行结果如下(部分区域的含义已经在下面描述):

public class Hello {

...

其中 Code 之后都是具体的指令,供 JVM 虚拟机执行。指令的具体含义可以参考 JAVA 官方文档。

从.class到.dex

上面生成的 .class 文件虽然已经可以在 JVM 环境中运行,但是如果要在 Android 运行时环境中执行还需要特殊的处理,那就是 dx 处理,它会对 .class 文件进行翻译、重构、解释、压缩等操作。

dx 处理会使用到一个工具 dx.jar,这个文件位于 SDK 中,具体的目录大致为你的 SDK 根目录/build-tools/任意版本里面。使用dx工具处理上面生成的 Hello.class 文件,在 Hello.class 的目录下使用下面的命令:

dx --dex --output=Hello.dex Hello.class

执行完成后,会在当前目录下生成一个 Hello.dex 文件。这个 .dex 文件就可以直接在 Android 运行时环境执行,一般可以通过 PathClassLoader 去加载 dex 文件。现在在当前目录下执行 dexdump 命名来反编译:

dexdump -d Hello.dex

执行结果如下(部分区域的含义已经在下面描述):

Processing 'Hello.dex'...

...

Mobile DevelopmentAndroidcode analysisDexAndroid Runtime
Youzan Coder
Written by

Youzan Coder

Official Youzan tech channel, delivering technical insights and occasional daily updates from the Youzan tech team.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.