快捷搜索:  as  MTU2MzAwMDgwOQ`

Android的multidex带来NoClassDefFoundError?

在为项目设置设置设备摆设摆设multidexing 的时刻,你可能会在运行的时刻看到java.lang.NoClassDefFoundError。这意味着app启动的class不在main dex文件中。Android SDK Build Tools 21.1或者更高版本中的GradleAndroid 插件有对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;

![746546456.jpg](http://upload-images.jianshu.io/upload_images/1526768-44a6fea4e3a8bd80.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

然后,在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

}

}

您可能还会对下面的文章感兴趣: