.class文件中的字节码与.dex文件的字节码之间的差异

时间:2016-04-01 12:26:54

标签: java android

我想知道.class文件中的字节码和.dex文件中的字节代码之后的区别代码有什么区别。它们的格式不同吗?如果是,则采用哪种格式

4 个答案:

答案 0 :(得分:5)

JVM .class包含JVM字节码。您可以在the JVM Specification中读取JVM字节码的规范,特别是Chapter 6: The Java Virtual Machine Instruction Set

.dex个文件包含Dalvik bytecode。 Dalvik是Android使用的原始VM。它现在已被Android Runtime取代。 Dalvik的原始版本是一个纯粹的解释器,后来添加了一个编译器。 ART是一个纯粹的编译器,它在安装时提前编译一次每次 >运行作为JIT编译器。)

JVM字节码和Dalvik字节码之间的主要区别是:

  • JVM是基于堆栈的,Dalvik是基于寄存器的
  • JVM字节码最初是为解释而设计的,虽然现在大多数JVM实际上都有编译器,而Dalvik字节码最初是为编译而设计的,尽管在第一版中它实际上是被解释的

答案 1 :(得分:4)

您可以找到有关构建过程的详细信息here

enter image description here

引用,

  •   

    所有Java代码,包括R.java和.aidl文件,都是   由Java编译器编译并输出.class文件。

  •   

    dex   工具将.class文件转换为Dalvik字节代码。任何第三方   您已包含在模块构建中的库和.class文件   也会转换为.dex文件,以便将它们打包   最后的.apk文件。

@Andreas评论的来源提供了Dalvik bytecode的技术见解,显然不是Java字节码。

答案 2 :(得分:2)

  1. Android应用程序通常用Java语言编写,并在Dalvik虚拟机(DVM)中执行,这与传统的Java虚拟机(JVM)不同。

  2. DVM由Google开发,针对移动操作系统(特别是Android平台)的特性进行了优化。

  3. 通过使用转换工具dx转换Java .class文件,Dalvik中运行的字节码从传统的JVM字节码转换为dex格式。与DVM相反,JVM使用纯Java类文件。

  4. JVM字节码由一个或多个.class文件组成(每个文件包含一个Java类)。在运行时,JVM将从相应的.class文件动态加载每个类的字节码。而Dalvik字节码只由一个.dex文件组成,包含应用程序的所有类。

  5. 在Java编译器创建了JVM字节码之后,Dalvik dx编译器删除所有.class文件并将它们重新编译为Dalvik字节码。然后dx将它们合并到一个.dex文件中。

  6. source is here

答案 3 :(得分:1)

Dalvik doc:http://source.android.com/devices/tech/dalvik/

Java doc:http://docs.oracle.com/javase/specs/

这两个文档完全不同。阅读所有疑问将被清除。

请参阅此ans:What is the difference between .class and .dex files?

注意:虽然Java jar文件有许多类文件,但每个APK文件只有一个classes.dex文件。根据Google的说法,出于性能和安全原因,APK格式与类文件格式不同。