1. 问题
我接入了移动推送SDK,运行时报出java.lang.NoClassDefFoundError找不到某个类,但SDK中明明包含这个类,为什么会这样?
2. 问题原因
如果您的App工程使用了multidex架构,可能会出现java.lang.NoClassDefFoundError,原因在于:推送SDK由于需要在application中进行初始化,所以相关类需要被放到MainDex文件中,否则在app启动时可能会报错。
3. 解决方案
通过修改Gradle构建脚本,可以将一些类显示放到MainDex中:
- afterEvaluate {
- tasks.matching{
- it.name.startsWith('create') && it.name.endsWith('MainDexClassList')
- }.each { tk ->
- tk.doLast {
- keepMainMultiDex(tk.outputFile);
- }
- }
- }
- /**
- * 控制MainDex中的class列表
- * 将multidex.keep的内容追加到 maindexlist.txt 中
- * @param outputFile
- */
- def keepMainMultiDex(File outputFile){
- File keepFile = file("multidex.keep");
- outputFile << '\n'
- outputFile << keepFile.getText('UTF-8')
- }
这样在gradle的构建过程中,会将multidex.keep文件中的类同样打到maindex中。接下来只需要将报出NoClassDefFoundError的类写到multidex.keep文件即可,如:
- com/alibaba/sdk/android/push/securitybox/alipush/AliPushSecurityBoxService
- com/alibaba/sdk/android/push/CloudPushService
- ......