集成Android SDK后運行App報java.lang.NoClassDefFoundError該如何解決?
更新時間:
問題詳述
接入移動推送 SDK 后,運行時報出java.lang.NoClassDefFoundError找不到某個類,但SDK中明明包含這個類,為什么會這樣?
問題原因
如果您的App工程使用了multidex架構(gòu),可能會出現(xiàn)java.lang.NoClassDefFoundError,原因在于:推送SDK由于需要在application中進行初始化,所以相關(guān)類需要被放到MainDex文件中,否則在app啟動時可能會報錯。
解決方法
通過修改Gradle構(gòu)建腳本,可以將一些類顯示放到MainDex中:
afterEvaluate {
tasks.matching{
it.name.startsWith('create') && it.name.endsWith('MainDexClassList')
}.each { tk ->
tk.doLast {
keepMainMultiDex(tk.outputFile);
}
}
}
/**
* 控制MainDex中的class列表
* 將multidex.keep的內(nèi)容追加到 maindexlist.txt 中
* @param outputFile
*/
def keepMainMultiDex(File outputFile){
File keepFile = file("multidex.keep");
outputFile << '\n'
outputFile << keepFile.getText('UTF-8')
}
這樣在gradle的構(gòu)建過程中,會將multidex.keep文件中的類同樣打到maindex中。接下來只需要將報出NoClassDefFoundError的類寫到multidex.keep文件即可(在app根目錄下創(chuàng)建),如:
com/alibaba/sdk/android/push/securitybox/alipush/AliPushSecurityBoxService
com/alibaba/sdk/android/push/CloudPushService
......
該問題為常規(guī)開發(fā)問題,MultiDex的使用建議直接看官方API文檔,此處示例如未生效,也可以在網(wǎng)上搜索”Multidex分包:將指定的類打包到主dex中”,配置后可以自行反編譯查看是否將找不到的類已打進主dex。
文檔內(nèi)容是否對您有幫助?