源码编译同时生成odex和apk文件的坑

来源:互联网 发布:无锡关键词排名优化 编辑:程序博客网 时间:2024/06/05 15:38

如果在编译源码时指定了生成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包方便调试了。



原创粉丝点击