AndroidStudio自定義dex最大方法數

方法數超過64K的處理

隨着軟件不斷增大,原來dex最大方法數65535的限制導致,爲了解決這個問題,Google官方提供了多dex的方案,Google官方說明:爲方法數超過 64K 的應用啓用多 dex 文件

默認情況下,Android Gradle插件會自動統計方法數,並自動決定將哪些類放入到maindex中,這樣一來,maindex往往是比較龐大,接近64k的限制,如果需要對apk進行特定的處理(比如國內第三方平臺的apk加固)可能會出現問題。

控制每個dex的方法數

只需要在項目程序模塊下面的build.gradle文件中增加dexOptions配置即可,配置如下

android {

    // .......
    dexOptions {
        javaMaxHeapSize "4g"
        preDexLibraries = false
        additionalParameters = ['--multi-dex',
                                '--set-max-idx-number=30000', //控制maindex裏面的最大方法數
                                '--minimal-main-dex' //maindex最小化,有這句會使得maindex只放必須的類,儘量最小化,會比其他dex要小很多
        ]
    }
}

主dex類清單文件

如果不配置主dex類清單文件,編譯器會自動進行分配主dex中的類。爲了避免分包過程中出現找不到類的情況,可能會需要將特定的類添加到主dex中,可以通過additionalParametersmain-dex-list屬性進行配置,他的參數值是文件路徑。具體配置如下:

android {

    // .......
    dexOptions {
        javaMaxHeapSize "4g"
        preDexLibraries = false
        additionalParameters = ['--multi-dex',
                                '--main-dex-list=maindexlist.txt', // 主dex類清單文件
                                '--minimal-main-dex' //maindex最小化,有這句會使得maindex只放必須的類,儘量最小化,會比其他dex要小很多
        ]
    }
}

注意:類清單文件是文件路徑,可以使用相對路徑,也可以使用絕對路徑;文件中類聲明的分隔符使用“/”,後綴爲.class。示例:com/test/App.class

注意事項

配置了dexOptions,但dex最大方法數不按配置生效?

  • 檢查是否啓用了D8編譯
    Google官方不斷提高AndroidStudio打包生成apk的效率,所以發明D8編譯打包,並在Android Gradle插件v3.1.0開始默認在AndroidStudio中啓用了。D8會導致這種分包不成功,如果不會按配置的方法數進行分包,可進行以下處理:
  1. 檢查項目中使用的Android Gradle插件的版本,可在項目目錄下的build.gradle中查看依賴,如下:
buildscript {
    //...

    dependencies {
        classpath "com.android.tools.build:gradle:3.3.0"  // Android Gradle插件

        classpath 'com.google.gms:google-services:4.2.0' // google-services plugin
    }
}
  1. 如果版本是3.1.0之前的版本,可以檢查程序模塊下的dexOptions配置是否有問題
  2. 如果版本是3.1.0或者更高的版本,可以選擇降低版本,或者禁用D8,禁用D8只需要在項目目錄下的gradle.properties文件中增加一行配置
android.enableD8=false
  • 檢查主dex類清單文件
    如果配置了主dex類清單文件,請檢查類清單文件,其中包括清單中類的路徑、分隔符、後綴,以及聲明的類是否存在。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章