Android5.0以下报NoClassDefFoundError
一开始,我的项目都是在API21(5.0)的情况下编写的,所以过程很顺利,没有任何的错误,但是偶然之下,我用了同事的4.4的测试机,发现只要用到网络请求的地方,就会报NoClassDefFoundError,毫无办法。因为项目里用到了okhttp跟retrofit,我一度以为是引入的包冲突了,在那查了半天,无果。后来发现是Multidex这个操作的时候有问题,网上一查,真的有这个问题,现在阐述一下具体解决过程。
论坛方法:
apply plugin: 'com.android.application'
android {
...
}
dependencies {
...
}
android.applicationVariants.all { variant ->
task "fix${variant.name.capitalize()}MainDexClassList" << {
logger.info "Fixing main dex keep file for $variant.name"
File keepFile = new File("$buildDir/intermediates/multi-dex/$variant.buildType.name/maindexlist.txt")
keepFile.withWriterAppend { w ->
// Get a reader for the input file
w.append('\n')
new File("${projectDir}/multidex.keep").withReader { r ->
// And write data from the input into the output
w << r << '\n'
}
logger.info "Updated main dex keep file for ${keepFile.getAbsolutePath()}\n$keepFile.text"
}
}
}
tasks.whenTaskAdded { task ->
android.applicationVariants.all { variant ->
if (task.name == "create${variant.name.capitalize()}MainDexClassList") {
task.finalizedBy "fix${variant.name.capitalize()}MainDexClassList"
}
}
}
clean 然后 rebuild 项目,完成之后在 module 下的 build/intermediates/multi-dex/xxx 里找到 maindexlist.txt 文件(如果找不到相关目录,可能需要你同步后 rebuild 项目才能生成),复制里面的内容到 module 根目录下 multidex.keep 文件中(没有则先创建此文件)
具体的步骤经测试可行
没用出现该maindexlist.txt 文件解决办法
在上述代码执行后并没有出现maindexlist.txt 这个文件(其实我一开始也没有- -),然后我查阅了android程序员都知道的网站,发现自己确实引用了
compile 'com.android.support:multidex:1.0.0'
也确实设置了
multiDexEnabled true
但是没有在manifest文件中设置(不太习惯使用markdown的标签,application缺少标签,见谅)
application
...
android:name="android.support.multidex.MultiDexApplication">
...
/application
重新运行,不报错,问题解决
自己新建的个人博客,至今还有很多的问题,如果谁有兴趣希望跟我联系,共同进步,共同学习,望不吝提出意见与指导,万分感谢!
网友评论