Too many classes in --main-dex-list

Android 打包开启multiDexEnabled还是爆Too many classes in--main-dex-list
 
  • 发表于 4个月前
  •  
  • 阅读 190
  •  
  • 收藏 2
  •  
  • 点赞 0
  •  
  • 评论 0
摘要: Android 打包开启multiDexEnabled还是爆Too many classes in --main-dex-list, main dex capacity exceeded

最新在集成公司的产品代码,加入自己项目里的,代码的方法数达17w+,开启了multiDexEnabled也还是爆.dex的64k限制了Too many classes in --main-dex-list, main dex capacity exceeded,随后找解决方案。
        方案一、去掉项目里没有使用的代码。项目代码有17w个方法,类也有不少,去掉不使用的代码,精简起来,在短时间内做不到。
        方案二、修改maindexlist.txt并替换项目里的maindexlist.txt文件,可Application里引用了一堆类而且还有好几个Application继承着,找到所有引用的类又是一个大工程。

        方案一暂时是不会采用的,因为去精简功能代码的工作量堪比重新开发工作量。最后,精简的效果能达到64K限制?能让分包不爆dex?不确定。
        方案二是个可行的,难点在于找到Application里的所有引用的类,这个工作有点大。网上大家也有这么做,也有写程序去找到所有引用。but,工程不小。

        最后,沿着方案二走。还好,度娘给了我DexKnife(https://github.com/ceabie/DexKnifePlugin)这个项目,利用这个gradle的插件,顺利把打包问题解决了。想了解DexKnife可以到GitHub和问度娘。

下面是我的解决打包问题的方法:
1、在项目里的build.gradle文件里配置

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.ceabie.dextools:gradle-dexknife-plugin:1.5.9'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

2、在运行模块里的build.gradle文件里配置

apply plugin: 'com.android.application'
apply plugin: 'com.ceabie.dexnkife'

并在运行模块根目录增加dexknife.txt文件


# 全局过滤, 如果没设置 -filter-suggest 并不会应用到 建议的maindexlist.
# 如果你想要某个包路径在maindex中,则使用 -keep 选项,即使他已经在分包的路径中.
-keep android.support.v4.view.**

# 这条配置可以指定这个包下类在第二dex中.
android.support.v?.**

# 使用.class后缀,代表单个类.
-keep android.support.v7.app.AppCompatDialogFragment.class

# 不包含Android gradle 插件自动生成的miandex列表.
-donot-use-suggest
-split **

# 将 全局过滤配置应用到 建议的maindexlist中, 但 -donot-use-suggest 要关闭.
#-filter-suggest

# 不进行dex分包, 直到 dex 的id数量超过 65536.
-auto-maindex

# dex 扩展参数, 例如 --set-max-idx-number=50000
# 如果出现 DexException: Too many classes in --main-dex-list, main dex capacity exceeded,则需要调大数值
-dex-param --set-max-idx-number=65536

# 显示miandex的日志.
-log-mainlist

# 如果你只想过滤 建议的maindexlist, 使用 -suggest-split 和 -suggest-keep.
# 如果同时启用 -filter-suggest, 全局过滤会合并到它们中.
-suggest-keep android.support.multidex.**

注意!!!,我这里使用的是-donot-use-suggest和-split **

3、 打开multiDexEnabled true

原文地址:https://www.cnblogs.com/tonny-li/p/7151670.html