Android 解决Dex超出方法数的限制问题

早期的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方案的一些弊端:

  1. DEX文件安装到设备的过程非常复杂,如果第二个DEX文件太大,可能导致应用无响应。此时应该使用ProGuard减小DEX文件的大小。

  1. 同样因为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

你可能感兴趣的:(Android开发)