美文网首页
Android的multidex带来NoClassDefFoun

Android的multidex带来NoClassDefFoun

作者: Mobile_Joy | 来源:发表于2016-03-13 17:31 被阅读0次

    在为项目配置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](https://img.haomeiwen.com/i1526768/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
        }
    }
    

    相关文章

      网友评论

          本文标题:Android的multidex带来NoClassDefFoun

          本文链接:https://www.haomeiwen.com/subject/szxflttx.html