在Android中,.dex文件是什么?
.dex文件是Android应用程序的编译代码文件。Android程序被编译成.dex(Dalvik可执行)文件,并被压缩成设备上的一个单独的.apk文件。.dex文件可以通过Android自动创建,通过将用Java编写的编译应用程序进行转换。
我的jar文件中包含了assets文件夹中的一些xml文件。我想将其作为.dex文件的一部分。有什么实现方法吗?
解决方法:
要将assets文件夹中的xml文件包含在.dex文件中,可以使用以下方法:
1. 将.xml文件放在assets文件夹下。
2. 在build.gradle文件中添加以下代码:
android { ... sourceSets { main { assets.srcDirs = ['src/main/assets', 'path/to/xml/files'] //将'path/to/xml/files'替换为.xml文件所在的路径 } } ... }
3. 使用Android Gradle插件重新构建项目。
重新构建项目后,.dex文件将包含assets文件夹中的xml文件。
.dex文件是在Dalvik虚拟机(Dalvik VM)上执行的文件。Dalvik VM具有性能优化、验证和监控等多个功能之一,其中之一是Dalvik Executable(DEX)。
Java源代码由Java编译器编译成.class文件。然后,Android SDK的dx(dexer)工具处理.class文件,将其转换为一种称为DEX的文件格式,其中包含Dalvik字节码。dx工具消除了类中存在的所有冗余信息。在DEX中,应用程序的所有类都打包到一个文件中。下表比较了JVM jar文件和dex工具处理的文件的代码大小。
在标准的Java环境中,Java代码中的每个类都会生成一个.class文件。这意味着,如果Java源代码文件有一个公共类和两个匿名类(例如用于事件处理),那么Java编译器将创建三个.class文件。
在Android平台上,编译步骤相同,因此会生成多个.class文件。但是,在生成.class文件之后,会使用“dx”工具将所有.class文件转换为一个单独的.dex文件,即Dalvik Executable文件。.dex文件经过了内存使用优化,并且设计主要受数据共享的驱动。
有时会存在多个dex文件,这是由于方法调用指令数量限制导致的。这个限制是65k个方法。在这种情况下,您的代码将不会存在于一个单独的文件中,而是存在于2个或更多个文件中,但其他所有内容仍然适用。此外,由于动态类加载也可用,您可以从文件中加载代码(再次以dexed形式),因此代码将存在于多个dex文件中。
什么是Android中的.dex文件?
在Android系统中,最引人注目的功能之一是Dalvik虚拟机(Android系统的核心)不使用Java字节码。相反,引入了一种自定义格式称为DEX,并且即使字节码指令也与Java字节码指令不同。
Android程序被编译为.dex(Dalvik可执行文件)文件,然后在设备上被压缩为单个.apk文件。.dex文件可以通过自动转换用Java编写的编译应用程序来创建。
.dex文件格式如下:
1. 文件头
2. 字符串表
3. 类列表
4. 字段表
5. 方法表
6. 类定义表
7. 字段列表
8. 方法列表
9. 代码头
10. 局部变量列表
Android有关Dalvik可执行文件格式(.dex文件)的文档。您可以在官方文档中了解更多信息:Dex文件格式。
.dex文件与Java类文件类似,但在旧版本的Android上在Dalvik虚拟机(DVM)下运行,并在设备上安装时使用ART编译为本机代码。
您可以使用提供在android-sdk中的dexdump工具来反编译.dex文件。
还有一些反编译技术可以从.dex文件生成.jar文件或.java类文件。
我的.jar文件中包含assets文件夹中的一些xml。我想将其作为.dex文件的一部分。有任何想法如何实现?
- .jar文件不包含任何android资源包(/asset),您必须使用Android Library Package来实现这一点。
在Android Lollipop上,ART是如何工作的?在哪里使用哪些文件,以及在哪个路径?有人说它将占用更多的空间。这是真的吗?如果是这样,为什么?我的意思是,本机代码似乎总是比字节码小得多,而.dex文件在工作原理上类似于字节码。
需要注意的一点是dexdump不是反编译器,而是反汇编器。