最新在集成公司的产品代码,加入自己项目里的,代码的方法数达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