在为项目配置multidexing 的时候,你可能会在运行的时候看到java.lang.NoClassDefFoundError。这意味着app启动的class不在main dex文件中。Android SDK Build Tools 21.1或者更高版本中的Gradle Android 插件有对multidex 的支持。这个插件使用Proguard 来分析你的项目并在 [buildDir]/intermediates/multi-dex/[buildType]/maindexlist.txt文件中生成一个app启动classes 的列表。但是这个列表并不是100%准确,可能会丢失一些app启动所需的classes 。
我们改如何做才能将app启动用到的类都加入到maindexlist.txt文件中呢?
经历多次尝试,终于找到了有效的方法。新建文件multiDexKeep.pro和multiDexKeep.txt,两个文件中加入你要打到mainexlist.txt文件中的类名。
.pro文件写法与混淆配置文件中保护类的写法一致;
.txt文件中包路径+类名.class;
然后,在build.gradle中加入:
multiDexKeepProguard file('multiDexKeep.pro') // keep specific classes using proguard syntax
multiDexKeepFile file('multiDexKeep.txt') // keep specific classes
最后,rebuild你的工程,重新构建完成你就可以在maindexlist.txt文件中找到响应的类;
也有同学给出如下方案,但在本人实践中并未生效:
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
// optional
dx.additionalParameters += "--main-dex-list=$projectDir/maindexlist.txt".toString() // enable the main-dex-list
dx.additionalParameters += "--minimal-main-dex" // enable the main-dex-list
}
}