方法数超过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类清单文件,请检查类清单文件,其中包括清单中类的路径、分隔符、后缀,以及声明的类是否存在。