早期的Dalvik VM内部使用short类型变量来标识方法的id,dex限制了程序的最大方法数是65535,如果超过最大限制,无法编译,把dex.force.jumbo=true添加到project.properties文件中可以通过编译,在低端手机无法安装,报错误INSTALL_FAILED_DEXOPT;
为此google提出了官方的解决方案-MultiDex;
1)在build.gradle中添加MultiDex的支持
defaultConfig {
applicationId "com.youyou.chao"
minSdkVersion 14
targetSdkVersion 22
versionCode 8
versionName "1.2.0"
// dex突破65535的限制
multiDexEnabled true
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
2)自定义Application,继承MultiDexApplication;
public class MyApplication extends FooApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
这样其实基本上已经实现了对方法数超过65535的支持;
MultiDex方案的一些弊端:
- DEX文件安装到设备的过程非常复杂,如果第二个DEX文件太大,可能导致应用无响应。此时应该使用ProGuard减小DEX文件的大小。
- 同样因为Dalvik linearAlloc的限制,如果请求大量内存可能导致崩溃。Dalvik linearAlloc是一个固定大小的缓冲区。在应用的安装过程中,系统会运行一个名为dexopt的程序为该应用在当前机型中运行做准备。dexopt使用LinearAlloc来存储应用的方法信息。Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或16MB。当方法数量过多导致超出缓冲区大小时,会造成dexopt崩溃。
参考文章:http://blog.csdn.net/t12x3456/article/details/40837287