Android中的ODEX文件是什么?


Answers:


84

该博客文章大部分是正确的,但并不完整。要全面了解odex文件的功能,您必须对应用程序文件(APK)的工作方式有所了解。

应用程序基本上是美化的ZIP存档。Java代码存储在名为classes.dex的文件中,该文件由Dalvik JVM解析,并且已处理的classes.dex文件的缓存存储在电话的Dalvik缓存中。

odex基本上是应用程序的classes.dex的预处理版本,可为Dalvik准备执行。对应用程序进行odex处理后,将从APK存档中删除classes.dex,并且不会将任何内容写入Dalvik缓存。一个未进行odex处理的应用程序最终获得了classes.dex文件的2个副本-打包在APK中,一个打包在Dalvik缓存中。由于Dalvik必须提取并处理classes.dex文件,因此首次启动也需要花费一些时间。

如果您要构建自定义ROM,则最好同时对框架JAR文件和常规应用程序进行odex处理,以最大程度地增加用户安装的应用程序的内部存储空间。如果要主题化,则只需deodex->​​应用主题-> reodex->​​发布。

要实际排毒,请使用small和baksmali:

https://github.com/JesusFreke/smali/wiki/Deodex指令


您能分享一下我们如何重新整理apk文件吗?
Basher51 2014年

22

此博客文章介绍了ODEX文件的内部结构:

什么是ODEX文件?

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


如果我希望我的应用程序具有相同的功能(应用程序在odex中运行而不是APK),该怎么办?
user1253435 2012年

你应该得到一个减号!dalvik不会优化启动时间。它的代码进行了优化,就像在从高级语言到低级语言的编译器中一样,只是在这种情况下,dalvik的代码几乎是对机器代码的转换。这就是为什么您可以使用C ++(不仅是Java)制作应用的原因。
cox

你确定APKs contain certain .odex files吗?
阿米尔·雷扎扎德

2

艺术

在ART中,.odex文件包含:

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

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

此外,它们似乎是常规的共享库,因为如果您有任何应用程序,请检查:

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似乎可以正常工作,并提供了一些有意义的分解(还包括一些垃圾处理部分)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.