1. 概述
随着时代的进步,人们对app的需求越来越大,同时app也会不断的进行迭代,导致app变得会越来越大,再加上也需要导入一些第三方框架、第三方类库文件,apk体积可能会变得更大,因此可能会报如下错误:
图片.png
Android是基于Java语言,Java语言在编译之后都会生成字节码文件 .class,在Android中这些字节码文件都被存储在 .dex文件中,由于 DEX的文件格式限制,其中的 Method、Field、Class的个数都不能超过short类型最大值 65535,如果超过这个值,就会报上边的错误。
为了解决这个问题,谷歌在API21的时候提供了一个 通用的解决方案,就是 MultiDex方案,这个方案可以让 Android系统在原始的 DEX文件存满之后自动生成一个新的 DEX文件,从而解决 DEX溢满的问题。
2. MultiDex的配置
1>:在build.gradle中配置两个地方,就是下边的第一、第二、第三:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.novate.multidexa"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// 第一:设置MultiDex可用
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// 第二:防止编译的时候oom、GC
dexOptions {
javaMaxHeapSize "4g"
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
// 第三:MultiDex的依赖
compile 'com.android.support:multidex:1.0.0'
}
2>:在项目的 gradle中再去配置如下的第三:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
// 第四:保证dex_files文件中指定的文件都加载到Main Dex中
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
dx.additionalParameters += "--main-dex-list=$projectDir/dex_files".toString()
}
}
3>:在BaseApplication中复写 attachBaseContext()方法用于把 MultiDex注入到项目中:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/4/4 14:55
* Version 1.0
* Params:
* Description:
*/
public class BaseApplication extends Application {
/**
* 这个最先执行
*/
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 把MultiDex 注入到项目中
MultiDex.install(base);
}
/**
* 程序启动的时候执行
*/
@Override
public void onCreate() {
super.onCreate();
}
}
具体代码已上传至github:
https://github.com/shuai999/MultiDexDemo.git