为什么我们需要将 *.odex 文件放在 /system/app 下,即使我们已经有了 /data/dalvik-cache?

Why do we need to put the *.odex files under /system/app even if we already have /data/dalvik-cache?

例如,我们在/system/app下有phone.apkphone.odex。根据一些非官方文档,phone.odex 用于加快加载应用程序的过程。但是,为什么我们不把phone.odex放在/data/dalvik下面呢?

更奇怪的是:在/data/dalvik下存在一个名为system@app@phone@classes.dex的文件,当应用程序加载时,优先加载哪个,/system/app/phone.odex/data/dalvik/system@app@phone@classes.dex?

phone.odex放在/system/app下面是不是完全多余了?

/system/app 目录在普通(非开发人员)设备上是只读的,只有在系统收到更新时才会更新。 /system/app/*.odex 的要点是 .odex 文件可以作为系统更新的一部分提供,因此它不必在第一次 post-更新启动时生成,并且不会吃掉在 /data 分区上向上 space。

如果 .apk 和 .odex 文件不同步,系统将无法覆盖 /system/app 中的 .odex,并将尝试在 /data/dalvik-cache 中生成正确的版本。通常这会失败,因为当 .apk 和 .odex 成对交付时,.apk 不包含 .dex 文件(这样做是多余的)。

首先扫描 /system/app 中的 .odex,因此它基本上优先。

发现多余的 .odex 不是预期的,并且表明设备在某些时候有一个 phone.apk,其中包含一个 .dex,但与 .odex 不匹配。