接入移动推送 SDK 后,运行时报出java.lang.NoClassDefFoundError找不到某个类,但SDK中明明包含这个类,为什么会这样?
通过修改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文件即可(在app根目录下创建),如:
com/alibaba/sdk/android/push/securitybox/alipush/AliPushSecurityBoxService
com/alibaba/sdk/android/push/CloudPushService
......
该问题为常规开发问题,MultiDex的使用建议直接看官方API文档,此处示例如未生效,也可以在网上搜索”Multidex分包:将指定的类打包到主dex中”,配置后可以自行反编译查看是否将找不到的类已打进主dex。
更多官方信息
EMAS官网介绍:https://www.aliyun.com/product/emas
Devops:https://www.aliyun.com/product/emascrash/mobile_devops
移动热修复:https://www.aliyun.com/product/hotfix
移动测试:https://www.aliyun.com/activity/emas/mqcexpert
移动推送:https://www.aliyun.com/product/cps
HTTPDNS:https://www.aliyun.com/product/httpdns
EMAS 控制台: https://emas.console.aliyun.com/products
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。