Android 中的 ODEX 文件是啥?

Posted

技术标签:

【中文标题】Android 中的 ODEX 文件是啥?【英文标题】:What are ODEX files in Android?Android 中的 ODEX 文件是什么? 【发布时间】:2012-03-24 12:16:36 【问题描述】:

在安装了一些android 应用程序后,我发现它会在智能手机中更改为odex 文件(而不是apk)。 它是如何发生的?谁能教教我,我很感兴趣。

【问题讨论】:

【参考方案1】:

The blog article 基本正确,但不完整。要全面了解 odex 文件的作用,您必须了解一点应用程序文件 (APK) 的工作原理。

应用程序基本上是经过美化的 ZIP 档案。 Java 代码存储在名为 classes.dex 的文件中,该文件由 Dalvik JVM 解析,处理后的 classes.dex 文件的缓存存储在手机的 Dalvik 缓存中。

odex 基本上是应用程序 classes.dex 的预处理版本,可为 Dalvik 执行做好准备。当应用程序被 odexed 时,classes.dex 会从 APK 存档中删除,并且不会将任何内容写入 Dalvik 缓存。一个没有被 odexed 的应用程序最终会得到 2 个 classes.dex 文件的副本——一个在 APK 中打包,一个在 Dalvik 缓存中处理。由于 Dalvik 必须提取和处理 classes.dex 文件,因此第一次启动也需要更长的时间。

如果您要构建自定义 ROM,最好同时对您的框架 JAR 文件和库存应用程序进行 odex,以便为用户安装的应用程序最大化内部存储空间。如果你想要主题,那么只需 deodex -> 应用你的主题 -> reodex -> 发布。

要实际 deodex,请使用 small 和 baksmali:

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

【讨论】:

您能分享一下我们如何重新编排 apk 文件吗?【参考方案2】:

This Blog article 解释 ODEX 文件的内部结构:

什么是 ODEX 文件?

在 Android 文件系统中,应用程序以带有 扩展名.apk。这些应用程序包或 APK 包含某些 .odex 文件,其假定功能是节省空间。这些'odex' 文件实际上是应用程序部分的集合,它们是 开机前优化。这样做会加快启动过程,因为它 预加载应用程序的一部分。另一方面,也让 破解这些应用程序很困难,因为部分编码具有 在执行之前已经被提取到另一个位置。

【讨论】:

如果我希望我的应用有同样的功能(应用在odex而不是APK中运行),该怎么做? 你应该得到一个减号! dalvik 不会优化启动时间。它的代码像编译器一样从高级语言到低级语言进行了优化,只是在这种情况下,dalvik 的代码几乎是机器代码的翻译。这就是为什么你可以用 C++ 制作应用程序,而不仅仅是用 java。 你确定APKs contain certain .odex files?!【参考方案3】:

艺术

根据文档: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 似乎工作并给出了一些有意义的反汇编(但也有一些垃圾部分)。

【讨论】:

以上是关于Android 中的 ODEX 文件是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android系统APP的odex转dex

Android系统APP的odex转dex

Android体系结构

Android各版本虚拟机的Dexopt区别

Android中dex文件的加载与优化流程

odex文件格式