1. 问题
我接入了移动推送SDK,运行时报出java.lang.NoClassDefFoundError找不到某个类,但SDK中明明包含这个类,为什么会这样?
2. 问题原因
如果您的App工程使用了multidex架构,可能会出现java.lang.NoClassDefFoundError,原因在于:推送SDK由于需要在application中进行初始化,所以相关类需要被放到MainDex文件中,否则在app启动时可能会报错。
3. 解决方案
通过修改Gradle构建脚本,可以将一些类显示放到MainDex中:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
并且(it.name.endsWith('MainDexClassList') || it.name.endsWith('MainDexList'))}.each { task -> task.doLast { def output = task.outputs.files.singleFile def input = file('multidex-config.txt') if (input.exists()) { def includeList = input.readLines().collect { 'class ' + it } output.text = output.text + '\n' + includeList.join('\n') } } }} 在上述解决方案中,首先通过afterEvaluate
在Gradle构建过程的后期阶段执行操作,这样可以确保所有配置都已经解析完成。然后,使用tasks.matching
来查找以create
开头且以MainDexClassList
或MainDexList
结尾的任务,这些任务通常负责生成主dex类列表。
接下来,对找到的每个任务执行一个doLast
操作,这意味着在任务执行完成后会额外执行一些操作。这里读取一个名为multidex-config.txt
的文件(您需要创建这个文件并列出需要包含到Main Dex中的类名),将这些类名添加到Main Dex的类列表中。
请确保multidex-config.txt
文件位于您的项目根目录下,并且每一行包含一个需要被加入Main Dex的类的全限定名。例如:
com.aliyun.push.PushService
com.aliyun.push.example.MyApplication
这样,当您的应用构建时,指定的类就会被确保包含在主DEX文件中,从而避免了运行时因找不到类而抛出java.lang.NoClassDefFoundError
的错误。记得在修改完Gradle脚本后同步项目并重新构建App。