作为一个Android程序开发猿,如果你还没遇到Conversion to Dalvik format failed:Unable to execute dex:method ID not in [0,0xffff]:65536这个异常的话,只能说明要么你是大牛,要么就是还只停留在码农的阶段。其实这个异常是谷歌限制的放法数不能超过65K的限制,随着你的程序的不断扩大,总有一天会遇到,以前我待的公司都是做的外包项目,做完了直接交付,也不维护的,所以基本不会遇到这样的异常,偶尔遇到,也是采用的最简单的方法去解决,的确,这样能通过编译,但是遗憾的是在2.3的系统的Android手机上直接crash,报INSTALL_FAILED_DEXOPT异常,因为是外包项目嘛,所以这些手机直接忽略。后来换了家公司,开始做自己的产品,没有自己的框架,全靠第三方的开源jar包支撑,日积月累,项目工程月来源大,唉,终于,久违的方法数超出的异常出现了,迫于工作压力,只能寻找合适的方法去解决,最后通过分包机制完美解决,下面一起来分享下这个解决方法,希望对大家能有所帮助,让你们少走弯路。
原因:
1.一个Dex文件中存储方法id用的是short类型数据,所以dex中的放法术不能擦后果65k
2.在2.3系统之前虚拟机内存只分配了5M
解决办法1:(不够彻底,表面的)
在Project.proterty中配置dex.force.jumbo=true,能编译通过,但是在2.3的机器上直接crash。
解决办法2:(彻底,完美)
1.打开项目的build.gradle文件,添加android-support-multidex.jar的以来文件
compile 'com.android.support:multidex:1.0.0'
2.设置虚拟机堆内存大小,避免编译期间OOM,一般设置2g够了
dexOptions {
javaMaxHeapSize "2g"
}
3.添加其他配置(multiDexEnabled true)
defaultConfig {
applicationId "com.tb.demo"
minSdkVersion 14
targetSdkVersion 21
versionCode 67
versionName "3.1.0"
// Enabling multidex support.
multiDexEnabled true
4.在Application中做设置
如果你的程序有自定义的Application,那么可以选择将你的Application继承MultiDexApplication,或者在你的Application中添加以下代码
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package android.support.multidex;
import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;
public class MultiDexApplication extends Application {
public MultiDexApplication() {
}
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
配置完成,恭喜你,分包机制已经配置完成,直接编译即可通过,他将生成2个Dex文件,完美解决65K的限制