Android的multidex带来NoClassDefFoundError?

在为项目配置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;

![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
    }
}

推荐阅读更多精彩内容