方法數超過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中,可以通過additionalParameters
的main-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會導致這種分包不成功,如果不會按配置的方法數進行分包,可進行以下處理:
- 檢查項目中使用的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
}
}
- 如果版本是3.1.0之前的版本,可以檢查程序模塊下的dexOptions配置是否有問題
- 如果版本是3.1.0或者更高的版本,可以選擇降低版本,或者禁用D8,禁用D8只需要在項目目錄下的
gradle.properties
文件中增加一行配置
android.enableD8=false
- 檢查主dex類清單文件
如果配置了主dex類清單文件,請檢查類清單文件,其中包括清單中類的路徑、分隔符、後綴,以及聲明的類是否存在。