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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM