最新在集成公司的產品代碼,加入自己項目里的,代碼的方法數達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