最初以為是 apk 的簽名,後來問了壹位對Android 比較資深的同事,終於明白了其中原理
編譯系統會對 system/framework/下面的 jar 以及 system/app下面的apk 文件優化,生成 odex 文件
由於jars, apks 有依賴關系,odex 文件會記住它所依賴 odex 的 signature
比如 framework.odex 依賴於 core.odex, 如果咱們改動並重新生成了 core.odex
因為 framework.odex 是基於老的 core.odex 做得優化, ( fraemwork.odex 以前計算的偏移可能不對),所以 framework.odex 在已經更新 core.odex 系統中已失效,所以 framework.odex 也要重新生成。
這可以解釋為何系統更新了,所有apk 都自動升級
系統以前安裝 apk 的時候,為 apk 生了了 odex 文件, 系統升級後,這些 odex 文件都失效,因此要重新生成
就是說: 因為 apk 依賴 system/framework/ 下的.odex更新了, apk 要基於這些系統.odex 重新生成 odex, 相當於重新安裝
如果只是該 C文件,重新生成 system/lib 的so 文件,則不用重新生成odex文件
看來都是odex出的錯,要取消,可以
1)編譯的時候用:WITH_DEXPREOPT=false
2)在Android.mk中加上:
LOCAL_DEX_PREOPT := false
但系統啟動的時候應該就要檢驗,並生成odex,可能多花些時間