Android中的ODEX文件是什么?
在安装了一些android
应用程序之后,我发现它会在智能手机中更改为odex
文件(而不是apk
)。 它是如何发生的? 谁可以教我,我对此非常感兴趣。
博客文章大多是正确的,但并不完整。 要充分了解odex文件的功能,您必须了解应用程序文件(APK)的工作方式。
应用程序基本上是荣耀的ZIP档案。 java代码存储在一个名为classes.dex的文件中,该文件由Dalvik JVM进行解析,处理后的classes.dex文件的缓存存储在手机的Dalvik缓存中。
odex基本上是应用程序的classes.dex的预处理版本,可以为Dalvik执行。 当应用程序被索引时,classes.dex将从APK档案中移除,并且它不会向Dalvik缓存写入任何内容。 没有提供索引的应用程序最终会得到2个classes.dex文件副本 - APK中的打包文件,以及Dalvik缓存中已处理的文件。 自从Dalvik必须提取和处理classes.dex文件以来,第一次启动需要更长的时间。
如果您正在构建自定义ROM,那么为了最大限度地为用户安装的应用程序提供内部存储空间,对于您的框架JAR文件和库存应用进行索引是一个非常好的主意。 如果你想主题,那么只需deodex - >应用你的主题 - > reodex - >发布。
要真正deodex,使用小和baksmali:
http://code.google.com/p/smali/wiki/DeodexInstructions
本博客文章解释了ODEX文件的内幕:
什么是ODEX文件?
在Android文件系统中,应用程序以扩展名.apk打包。 这些应用程序包或APK包含某些.odex文件,它们的功能是节省空间。 这些'odex'文件实际上是在引导之前优化的应用程序部分的集合。 这样做会加快启动过程,因为它会预先加载应用程序的一部分。 另一方面,由于在执行之前已经将一部分编码提取到另一位置,所以它也使得那些应用程序变得困难。
艺术
在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
似乎可以工作并给出一些有意义的反汇编(但也包括一些垃圾部分)。