Android Retrofit報錯NoClassDefFoundError異常
使用Retrofit 2時踩了個坑,自己封裝的Retrofit工具在4.4的手機上跑崩了,測試了下機型,發現在Android 5.x以上的手機就不會出現這樣的情況,而在Android 4.x手機上這個問題是必現的
錯誤資訊
java.lang.NoClassDefFoundError: retrofit2.Retrofit$Builder
一看到這個錯誤資訊,馬上聯想到是否是類缺失了,但是這裡指向的是Retrofit2.Retrofit$Builder,匯入第三方類庫怎麼還會缺少類呢,而且如果是類缺失,那麼在程式編譯期間就會報錯的,仔細一看是自己眼花了,NoClassDefFoundError
ClassNotFoundException
經常容易被搞混,這兩個錯誤型別雖然都指的是找不到類,但是差異還是挺大的
ClassNotFoundExceptio
這個錯誤比較好解決,就是程式找不到指定的class類,就會出現這個問題,通常發生在程式的編譯期間
NoClassDefFoundError
這個錯誤就比較難找了,在程式正常編譯後還報這個未找到類的異常,也就是說這個class類在程式的編譯階段並沒有缺失,但是在程式執行階段,無法把它正常的從記憶體中加載出來,我們通常使用new
方法來例項化一個類,如果這個類在程式執行的時候“失蹤”了,那麼就會丟擲這個異常。
class A {
public String getMethod(){
return "method";
}
}
public class B {
public static void main(String[] args)
{
A a = new A();
System.out.println(a.getMethod());
}
}
就比如說,我們有兩個類A和B,B呼叫A中的方法,我們編譯好後,實際上是生成了兩個.class檔案,這個時候如果我們把A.class檔案刪掉,再執行程式,那麼就會出現NoClassDefFoundError
解決方法
瞭解了異常產生的原因,就開始對症下藥了,居然在編譯期間沒有出錯,那麼說明類檔案並沒有缺失,而是在編譯完成後,執行程式時無法正常的獲取到Retrofit$Builder
類。
在Android中,我們經常會使用到分包方法,即multiDexEnabled
,尤其是當我們的程式應用了大量第三方框架的時候,這個引數就更重要了,因為Android中編譯的單個.dex檔案最多支援65536個方法,而如果大於這個方法數,就需要使用到multiDexEnabled
方法對Dalvik可執行檔案.dex進行分包了,而在分包的時候就可能把Retrofit需要使用到的方法分到不同的dex檔案中,所以問題應該就出在multiDexEnabled
的使用上了。
android {
...
defaultConfig {
...
multiDexEnabled true
}
...
}
這個分包方法,是在Android 5.0之後提供的,如果程式執行在5.0以上的手機,版本設定為minSdkVersion 21
以上的應用來說,以上這麼配置的方式就可以了
而我在程式中指定的最低支援到的版本是API 19,所以為了相容Android 5.0以下的手機,需要在build.gradle
添加個依賴庫com.android.support:multidex:1.0.1
android {
...
defaultConfig {
...
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
同時,對於被我們替換的Application
類,需要繼承的是MultiDexApplication
,而不是Application
public class AppApplication extends MultiDexApplication {...}
通過以上的正確方法配置好了之後,再次執行,就沒有再報NoClassDefFoundError
錯誤了。
- 如果你不想繼承
MultiDexApplication
類,而需要繼承其它型別的Application
類,那麼可以通過重寫其attachBaseContext
方法,在其中
手動呼叫 Dalvik 可執行檔案分包方法MultiDex.install()
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(context);
MultiDex.install(this);
}
- 如果沒有替換
Application
類,那麼就需要在配置檔案AndroidManifest.xml
中指定<application>
標籤的name為android.support.multidex.MultiDexApplication
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.text">
<application
android:name="android.support.multidex.MultiDexApplication" >
...
</application>
</manifest>
總結
事實上這個錯誤並不是由於Retrofit本身造成的,而是錯誤的使用multiDexEnabled
方法造成的,對於多Android版本的相容性處理的不夠好,導致出現了上述問題
當應用程式指定了最小支援的版本號時,應該以這個最小版本號為準,最好適配工作,使用相容包去處理高低版本之間的差異性問題。
相關推薦
Android Retrofit報錯NoClassDefFoundError異常
使用Retrofit 2時踩了個坑,自己封裝的Retrofit工具在4.4的手機上跑崩了,測試了下機型,發現在Android 5.x以上的手機就不會出現這樣的情況,而在Android 4.x手機上這個問題是必現的 錯誤資訊 java.lang.NoCla
react-native開發異常處理——react-native run-android命令報錯
react-native學習交流QQ群:806870562在終端使用命令react-native run-android報錯,如下圖所示:其中說到No connected devices!,我便猜測是不
Android studio 報錯 gradel project sync failed Error:Cause: peer not authenticated
authent post -m -h cal all del erro 文件 在網上找了半天,應該是找不到gradel的路徑,試了網上非常多方法。本人解決例如以下: 在android studio中設置gradle。打開File-> settings->Gr
Android Studio 報錯Guest isn't online after 7 seconds 解決方案
avd 重啟 ott 步驟 bsp ont pan 虛擬 div 最近使用真機模擬之後,再使用虛擬機就頻繁出現這個問題;解決步驟如下:1.打開Android虛擬設備管理器,2.查看Actoins欄下拉圖標,3.選擇冷啟動模式即可,4.重啟AVD正常;Android Stu
Android Studio報錯gradle project sync failed.Basic functionality(e.g.editing,debugging) will not work
昨天剛安裝完Android Studio ,坑是真的多 首先你要下載一個sdk 和一個Android studio 安裝包 看了好多安裝教程部落格,感覺這篇還是不錯的:https://www.cnblogs.com/xiadewang/p/7820377.html 接下來你應該
com.android.support 報錯,apt不支援,butterknife構建不通過
com.android.support:design:26.0.0 這個包一直載入不上,編譯不通過 加入maven倉庫的地址or google repositories { maven { url "https://jitpack.io" }//
Android程式碼報錯彙總
本帖子是個人開發中遇到的錯誤,會在此處做一個記錄,會持續更新。 1. 匯入依賴時,有時會報錯(類似下列錯誤) More than one file was found with OS independent path ‘META-INF/DEPENDENCIES’
[轉]開啟Android Studio報錯“Error running ***: Please select Android SDK”
今天開啟Android Studio編譯專案正常,但在執行Run app的時候莫名其妙彈出配置對話方塊,一看SDK配置沒什麼問題,就直接單擊“Run”按鈕,誰料下面的訊息視窗直接提示執行錯誤“Error running ***: Please select Android SDK”
Android studio 報錯Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled
在進行安卓的真機測試時,遇見這個問題:Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled. 錯誤執行應用程式:即時執行需要啟用“tools|an
android 除錯 報錯
今天開啟eclipse 進行除錯的時候突然出現了報錯,報錯資訊如下: The connection to adb is down, and a severe error has occured. [2013-06-15 09:36:56 - HelloOPone] Y
Android studio3 報錯module not specified解決方案
說一下我的環境: Android Studio 3.2.1 Build #AI-181.5540.7.32.5056338, built on October 9, 2018 JRE: 1.8.0_152-release-1136-b06 amd64 JVM: OpenJDK 64-Bit
開啟Android Studio報錯“Error running ***: Please select Android SDK”
今天開啟Android Studio編譯專案正常,但在執行Run app的時候莫名其妙彈出配置對話方塊,一看SDK配置沒什麼問題,就直接單擊“Run”按鈕,誰料下面的訊息視窗直接提示執行錯誤“Error running ***: Please select Android S
Android Studio報錯a problem occurred configuring project ' app'. java.lang.nullpointerexception
今天換了臺新電腦,把老電腦上的android studio專案打成壓縮包,拷貝到新電腦上解壓執行, 結果給我報了個 a problem occurred configuring project ’ :l
android handler報錯解決方法
1. import java.util.logging.Handler;這個包了會自動生成如下方法。當時還覺得和以前的不一樣了,本不在意。 Handler handler1= new Handler() { @Override
Android 日常報錯之 Android dependency 'com.android.support:support-v4' has different version
Caused by: java.lang.RuntimeException: Android dependency 'com.android.support:support-v4' has diffe
Android出現:Your project path contains non-ASCII characters報錯、Could not find com.android.support.報錯
安卓在匯入或者建立專案時,專案名字是不可以含有中文的,只要有中文就會報錯,下面是本人在匯入android專案時由於忘記這個常識而犯的錯誤,還有就是另一個錯誤新增依賴時程式報的錯誤,現在利用網上的大牛們的部落格整合起來寫了這個部落格,用來以後提醒自己: 第一個
android webview報錯A general erro has occurred.Please contact support
這個問題剛出現時,淚奔,後面用騰訊X5核心來解決都不行,還好沒有放棄治療,解決問題如下: webview內部報: A general erro has occurred.Please conta
android studio 報錯:Failed to load AppCompat ActionBar with unknown error
最近開始學Android Studio,但在第一次編寫介面的時候就遇到了問題,問題表現為新增Button之後,介面並未顯示,並且丟擲了錯誤和警告: 在Stack Overflow 上找到的解決方案:
react native 執行 react-native run-android 啟動報錯
在前一天明明開發得很好,react-native run-android一執行就能跑起來,但是第二天開發時執行react-native run-android命令就出現如下錯誤: 報這個的原因有很多,博主沒有仔細找具體原因,由於開發時間緊急,發現一個治標不治本
Android Studio報錯:Write access is allowed from event dispatch thread only
新安裝的android studio 編譯工程時出現了Write access is allowed from event dispatch thread only 的錯誤。 在stackoverflow中發現答案: So the problem was con