MultiDex解决64问题、方法数超过 65535解决方法

1. 概述


随着时代的进步,人们对app的需求越来越大,同时app也会不断的进行迭代,导致app变得会越来越大,再加上也需要导入一些第三方框架、第三方类库文件,apk体积可能会变得更大,因此可能会报如下错误:


MultiDex解决64问题、方法数超过 65535解决方法_第1张图片
图片.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: [email protected]
 * 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

你可能感兴趣的:(MultiDex解决64问题、方法数超过 65535解决方法)