安卓中的ODEX文件是什么?

87
一些安装了android应用后,我发现它们会在智能手机中变成odex文件(不是apk)。它是如何实现的?谁能教我,我非常感兴趣。
3个回答

91

这篇博客文章基本上是正确的,但并不完整。要完全理解odex文件的作用,您需要了解一些应用程序文件(APK)的工作方式。

应用程序基本上是被吹嘘的ZIP存档。Java代码存储在一个名为classes.dex的文件中,并且Dalvik JVM解析此文件并将处理后的classes.dex文件的缓存存储在手机的Dalvik缓存中。

odex基本上是应用程序classes.dex的预处理版本,可供Dalvik执行。当应用程序进行odex时,classes.dex从APK存档中删除,并且不向Dalvik高速缓存写入任何内容。未经odex的应用程序最终会有两个classes.dex文件--APK中打包的文件和Dalvik缓存中的已处理文件。由于Dalvik必须提取和处理classes.dex文件,因此启动时间稍长。

如果您正在构建自定义ROM,最好对框架JAR文件和原始应用程序进行odex处理,以最大化用户安装的应用程序的内部存储空间。如果要进行主题设置,则只需解压缩-> 应用您的主题->重新odex->发布即可。
要实际解odex,请使用small和baksmali:

https://github.com/JesusFreke/smali/wiki/DeodexInstructions


请问您能分享一下如何重编译APK文件吗? - Basher51
只是想补充一下,DEX 是 Delvik 可执行文件的缩写,而 ODEX 是优化的 Delvik 可执行文件的缩写。 - aggregate1166877

23

这篇博客文章详细介绍了ODEX文件的内部结构:

什么是ODEX文件?

在Android文件系统中,应用程序以扩展名.apk的形式打包。这些应用程序包或APK包含某些.odex文件,其预期功能是节省空间。这些“odex”文件实际上是应用程序的部分集合,在引导之前进行了优化。这样做可以加快引导过程,因为它预加载了应用程序的部分。另一方面,它也使得攻破这些应用程序变得困难,因为执行之前已经将部分代码提取到另一个位置。


如果我希望我的应用程序具有相同的功能(应用程序在odex中运行而不是APK),该怎么做? - user1253435
你应该得到一个负数!Dalvik不会优化启动时间。它的代码优化类似于从高级语言到低级语言的编译器,只是在这种情况下,Dalvik的代码几乎是对机器码的翻译。这就是为什么你可以用C++而不仅仅是Java来制作应用程序的原因。 - cox
2
你确定 APKs 包含某些 .odex 文件 吗?! - amrezzd

7

ART

根据文档:http://web.archive.org/web/20170909233829/https://source.android.com/devices/tech/dalvik/configure.odex 文件:

包含 APK 中方法的 AOT 编译代码。

此外,它们似乎是常规共享库,因为如果获取任何应用程序并检查:

file /data/app/com.android.appname-*/oat/arm64/base.odex

它说:

base.odex: ELF shared object, 64-bit LSB arm64, stripped

而且aarch64-linux-gnu-objdump -d base.odex似乎可行并且给出了一些有意义的反汇编指令(但也有一些垃圾部分)。


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