如果在编译源码时指定了生成odex文件的,那么apk的目录下,还会有一个同名的odex文件。此时apk中的class.dex文件会被移除。因为odex文件是dexopt程序对DEX文件进行优化得来的。目的是系统在首次启动时就不用再次去优化dex文件了,提升了首次启动app的速度。dex文件(odex也是)是包含可执行代码的文件。所以被移除了dex文件的apk是无法独立安装的,而dex文件也无法独立安装,因为缺少资源文件还有一些认证文件(meta-inf中)。
系统烧写到设备中,这些odex和apk是可以正常使用的。但是再编译生成odex和apk文件,然后push进入时,就无法生效。
下面是步骤和结果
1.替代apk时,可以运行,但是改动不会生效。
2.删除apk后,不可以运行。
3.删除odex和apk后,再把原来的push进入,不能运行。
4.编译指定不生成odex文件,push进入后,可以运行,并在/data/dalvik-cache/arm下存储class.dex
5.删除apk后,push进之前的odex+apk,可以运行,查看/data/dalvik-cache/arm下的dex文件没有被移除
6.移除/data/dalvik-cache/arm下的dex文件后,不能运行了
7.重新烧录系统,修改资源文件,生成odex的方式编译,将apk push进去,有效。
在应用的Android.mk下,的buildpackage之前加入LOCAL_DEX_PREOPT := false就可以指定不生成odex文件了。
整个源码编译应用不生成odex: build\core\package.mk 中156行改为 LOCAL_DEX_PREOPT := false
编JAR包,不生成odex
目前库上的代码编译framework时,同时生成了JAR和odex,此时push进去开机起不来。
解决方法:
编译时只生成jar包,不生成odex,即 build/core/java_library.mk 中37行改为 LOCAL_DEX_PREOPT := false。照上述修改后,全部重新编译,后续就可以mm单独编译jar包方便调试了。