Too many classes in --main-dex-list

Posted tonny.lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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





以上是关于Too many classes in --main-dex-list的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统报错排查:Too many open files in system

python: too many open files when using open fits file in a loop

Exception: Too many parameters were provided in this RPC request. The maximum

JasperReport由jrxml->jasper编译出错:Too many groovy classes were generated.

ES 遇到的一个坑too_many_clauses: maxClauseCount

chatgpt报错:Too many requests in 1 hour. Try again later.解决办法