方法数超了65535 无法安装的解决方案

错误:Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536

作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常


解决这个问题很简单,我们只需要在Project.proterty中配置一句话就Ok啦,dex.force.jumbo=true 。

是的,加入了这句话,确实可以让你的应用通过编译,但是在一些2.3系统的机器上很容易出现 INSTALL_FAILED_DEXOPT异常


至于适配2.3的系统谁还去做这种事。。。。

错误原因:(有些傻逼面试官会问的)

1、Android系统中,一个Dex文件中存储方法id用的是short类型数据,所以导致你的dex中方法不能超过65k
2、在2.3系统之前,虚拟机内存只分配了5M

这还涉及两种编程方式的学习:

一种 是以微信为代表的,将一些功能做成插件,动态加载,

另一种 方案是以facebook为代表的分包方案,将一个apk中的dex文件分割成多个dex文件,然后动态的去加载dex文件。

其实这两种方案的核心思想是一样的,插件是把未来要开发的新功能做成apk和dex动态加载,而分包方案是将已经完成的功能分成多个dex文件动态加载,其实我个人觉得插件方案比分包方案更好的解决了65k的问题,因为插件方案不仅能够解决65k问题,还能让我们的应用体积减小,而分包只能解决65k的问题。

插件发有个人写的可以学习一下:http://blog.csdn.net/yuanzeyao/article/details/38565345 . 

分包发极其复杂Android分包MultiDex原理详解

2.3版本之前dalvik虚拟机的内存只有5M,所以无论是插件方案还是分包方案在某些手机上还是会遇到该问题。

毕竟我们仅仅是减少了每个dex中包的数量,但是方法总数是没有减少的,所以解决此问题的根本方法就是修改虚拟机内存至8M,这个需求在Java层是无法实现,但是可以在c层实现,具体实现流程可以参考开源项目:
https://github.com/viilaismonster/LinearAllocFix.git

开源项目的使用方法:  Hack Dalvik VM解决Android 2.3 DEX/LinearAllocHdr超限



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章