早期的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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐