zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    volatile关键字,使一个变量在多个线程间可见。
    grep sed awk
    mysql高级聚合
    Hive高级聚合GROUPING SETS,ROLLUP以及CUBE
    用SecureCRT来上传和下载文件
    mysql导出导入数据
    redis入门
    spark 常用技巧总结2
    生成数据库字典
    spark 常用技巧总结
  • 原文地址:https://www.cnblogs.com/tonny-li/p/7151670.html
Copyright © 2011-2022 走看看