项目在很早之前方法数就超过65535,就加了google的Multidex。在第一次加入的无非就是根据api文档中的一步一步的加入到项目中:
基本方案
1、配置APP的build.gradle
在配置文件中增加:
defaultConfig {
// Enabling multidex support.
multiDexEnabled true
}
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
}
2、在代码中的Application中通过复写attachBaseContext方法中,调用MultiDex.install(this)
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
当然对于这里网上还有许多优化方案,大家可以针对这边做优化。我这里不在去copy。
这样就可以将项目分成好几个dex文件了,但是这个dex文件里面的方法数是随机的,但是不会超过65535。
问题
今天我想说的坑是最近遇到的配置文件中的问题。由于百度加固中要求每个dex的方法数不要超过65530。之前打出来的三个dex,其中有一个恰好是65532,好吧,每次利用百度加固都不成功,没办法只能去解决限制dex中方法的数量。
通过查找网上各种资料,发现有两种方法:
1、使用gradle中增加--set-max-idx-number=48000
2、第三方的dexnkife,github地址:https://github.com/ceabie/DexKnifePlugin。使用这种方式没有成功,就决定采用第一种方式。
在gradle中增加了
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
dx.additionalParameters += '--set-max-idx-number=48000'
}
发现不起任何作用,好吧又查找资料发现这种方式gradle1.5.0之后分包的方式已经换成下面这种方式
dexOptions {
javaMaxHeapSize "3g"
preDexLibraries false
additionalParameters '-multi-dex',
'--set-max-idx-number=48000'
}
加了之后发现还是不起作用,顿时感觉好崩溃。
好在看到了从gradle3.1.0之后dex编译采用D8。所以导致这种分包不成功。将gradle的版本降到3.0.0之后,分包成功,每个dex的方法都不超过48000。
另外也可以采用gradle3.1.0,然后将项目的gradle配置android.enableD8=false //暂时关闭
所以今天的目标就是看看3.1.0之后到底应该怎么设置,才能完成限制分包大小的功能