Android中的ODEX文件是什么?

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

  • 转换为Dalvik格式失败,错误1自facebook SDK
  • 如何在使用Google Play服务时避免65k方法限制
  • 在Android中双击lockinglocking
  • VFY:无法解析虚方法
  • Android NDK溢出dalvik JNI本地参考表
  • 无法编译,无法执行dex,无法合并,非Jumbo指令
  • 如何在android / dalvik上dynamic加载Java类?
  • inheritance的方法是否会计入Android中的Dex方法限制?
  • 博客文章大多是正确的,但不完整。 要充分了解odex文件的function,您必须了解应用程序文件(APK)的工作原理。

    应用程序基本上是荣耀的ZIP档案。 java代码存储在一个名为classes.dex的文件中,该文件由Dalvik JVM进行parsing,处理后的classes.dex文件的caching存储在手机的Dalvikcaching中。

    odex基本上是一个应用程序的classes.dex的预处理版本,可以为Dalvik执行。 当应用程序被索引时,classes.dex会从APK档案中移除,并且不会向Dalvikcaching中写入任何内容。 一个没有提供索引的应用程序最终会得到2个classes.dex文件的副本 – APK中的打包文件,以及Dalvikcaching中的处理文件。 由于Dalvik必须提取和处理classes.dex文件,因此也需要更长的一段时间才能启动。

    如果你正在构build一个自定义的ROM,为了最大限度地为用户安装的应用程序提供内部存储空间,最好将你的框架JAR文件和库存应用程序进行索引。 如果你想主题,那么只需deodex – >应用你的主题 – > reodex – >发布。

    要真正deodex,使用小和baksmali:

    http://code.google.com/p/smali/wiki/DeodexInstructions

    本博客文章解释了ODEX文件的内幕:

    什么是ODEX文件?

    在Android文件系统中,应用程序以扩展名.apk打包。 这些应用程序包或APK包含某些.odex文件,它们的function是节省空间。 这些“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似乎工作,并给一些有意义的反汇编(但也有一些垃圾部分)。