使用MultiDex解决65535限制问题

来源:互联网 发布:手机版施工软件 编辑:程序博客网 时间:2024/05/16 10:38

版权声明:本文为[qiufengyi002]的原创文章,转载请注明出处,否则禁止转载。


项目中使用了,但是一直不清楚是怎么做的,简单了解了下,知道了具体的流程


第一步,在app module下的build.gradle里允许使用

apply plugin: 'com.android.application'android {    compileSdkVersion 22    buildToolsVersion "22.0.1"    defaultConfig {        applicationId "*****************"        minSdkVersion 11        targetSdkVersion 19        versionCode 1        versionName "1.0.0"        multiDexEnabled true    }

第二步,在app module下的build.gradle里添加包引用,并且让自己的Application继承android.support.MultiDex.MultiDexApplication

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:multidex:1.0.0'
}

编译的时候会自动在external Libraries下下载的


第三步,为了防止出现主dex包过大的情况,导致NoClassDefFoundError错误的出现,需要 app module下创建 multidex.keep 文件,并在其中列出那些 class,以便让编译器知道在 main dex 文件中要保持哪些 class。

生成multidex.keep的方法为:

在app module下的build.gradle中添加如下代码

afterEvaluate {    tasks.matching {        it.name.startsWith('dex')    }.each { dx ->        if (dx.additionalParameters == null) {            dx.additionalParameters = []        }        //允许生成多个dex文件        dx.additionalParameters += '--multi-dex' // enable multidex        // 设置multidex.keep文件中class为第一个dex文件中包含的class,如果没有下一项设置此项无作用        dx.additionalParameters += "--main-dex-list=$projectDir/class-list.txt".toString()        //此项添加后第一个classes.dex文件只能包含-main-dex-list列表中class        dx.additionalParameters += '--minimal-main-dex'    }}
然后clean再rebuild项目,然后找到build/intermediates/multi-dex/xxx里 maindexlist.txt 文件(如果找不到相关目录,可能需要你同步后 rebuild 项目才能生成,如果还是没有,那就跑项目或者打包吧,虽然会报错),复制里面的内容到 module 根目录下 multidex.keep 文件中(没有则先创建此文件)。




第四步、把第三步中在app module中添加的代码删掉,加上如下代码

def patchKeepSpecs() {    def taskClass = "com.android.build.gradle.internal.tasks.multidex.CreateManifestKeepList";    def clazz = this.class.classLoader.loadClass(taskClass)    def keepSpecsField = clazz.getDeclaredField("KEEP_SPECS")    keepSpecsField.setAccessible(true)    def keepSpecsMap = (Map) keepSpecsField.get(null)    if (keepSpecsMap.remove("activity") != null) {        println "KEEP_SPECS patched: removed 'activity' root"    } else {        println "Failed to patch KEEP_SPECS: no 'activity' root found"    }}patchKeepSpecs()

以上方法是自己总结的,但是因为项目本身已经使用了,所以没有再重复走一遍流程,如果有需要的同学,可以看下,看是否成功。

0 0
原创粉丝点击