android
应用后,我发现它们会在智能手机中变成odex
文件(不是apk
)。它是如何实现的?谁能教我,我非常感兴趣。android
应用后,我发现它们会在智能手机中变成odex
文件(不是apk
)。它是如何实现的?谁能教我,我非常感兴趣。这篇博客文章基本上是正确的,但并不完整。要完全理解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文件的内部结构:
什么是ODEX文件?
在Android文件系统中,应用程序以扩展名.apk的形式打包。这些应用程序包或APK包含某些.odex文件,其预期功能是节省空间。这些“odex”文件实际上是应用程序的部分集合,在引导之前进行了优化。这样做可以加快引导过程,因为它预加载了应用程序的部分。另一方面,它也使得攻破这些应用程序变得困难,因为执行之前已经将部分代码提取到另一个位置。
APKs 包含某些 .odex 文件
吗?! - amrezzdART
根据文档: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
似乎可行并且给出了一些有意义的反汇编指令(但也有一些垃圾部分)。