开发者社区> 问答> 正文

成SDK后运行App报java.lang.NoClassDefFoundError该如何解决



1. 问题


我接入了移动推送SDK,运行时报出java.lang.NoClassDefFoundError找不到某个类,但SDK中明明包含这个类,为什么会这样?

2. 问题原因


如果您的App工程使用了multidex架构,可能会出现java.lang.NoClassDefFoundError,原因在于:推送SDK由于需要在application中进行初始化,所以相关类需要被放到MainDex文件中,否则在app启动时可能会报错。

3. 解决方案


通过修改Gradle构建脚本,可以将一些类显示放到MainDex中:

  1. afterEvaluate {
  2.     tasks.matching{
  3.         it.name.startsWith('create') && it.name.endsWith('MainDexClassList')
  4.     }.each { tk ->
  5.         tk.doLast {
  6.             keepMainMultiDex(tk.outputFile);
  7.         }
  8.     }
  9. }
  10. /**
  11. * 控制MainDex中的class列表
  12. * 将multidex.keep的内容追加到 maindexlist.txt 中
  13. * @param outputFile
  14. */
  15. def keepMainMultiDex(File outputFile){
  16.     File keepFile = file("multidex.keep");
  17.     outputFile << '\n'
  18.     outputFile << keepFile.getText('UTF-8')
  19. }

这样在gradle的构建过程中,会将multidex.keep文件中的类同样打到maindex中。接下来只需要将报出NoClassDefFoundError的类写到multidex.keep文件即可,如:
  1. com/alibaba/sdk/android/push/securitybox/alipush/AliPushSecurityBoxService
  2. com/alibaba/sdk/android/push/CloudPushService
  3. ......

展开
收起
猫饭先生 2017-10-24 09:31:49 2418 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载