当一个工程方法数过大时,往往会出现不能编译的情况,INSTALL_FAILED_DEXOPT 65535前段时间碰到这个问题困扰几天。
早期的Dalvik VM内部使用short类型变量来标识方法的id,dex限制了程序的最大方法数是65535,如果超过最大限制,无法编译,把dex.force.jumbo=true添加到project.properties文件中可以通过编译,在低端手机无法安装,报错误INSTALL_FAILED_DEXOPT。
如方法数量超过上线,必须精简方法数量。可以对复杂模块采用jni的方式实现,也可以对边缘模块采用本地插件化的方式解决。
但是如果精简方法数的话,工作量就比较大了。后来发现我们工程引用了很多第三方的jar文件,而且这些文件都是自动编译成android private libraries,这样编译的时候jar文件的方法也被认为是工程的方法了,编译的时候就会报上面的异常了。
最后还是使用做原始的办法手动加载这些jar文件,去掉android private libraries前面的勾。编译竟然通过了。
dex文件解决8M时,低端机安装也会出现INSTALL_FAILED_DEXOPT错误,因为dexopt用了一个固定大小的缓冲区存储所有的方法名,2.3(含)之前的版本只有5M大小,最新的版本有8M或者16M
2、如只是dex文件过大,可以采用混淆的方法减小dex文件尺寸,如混淆后还是过大,参考第一个方法。