1. 程式人生 > >Android Retrofit報錯NoClassDefFoundError異常

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 RetrofitNoClassDefFoundError異常

使用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 Studiogradle 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 Studioa 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 webviewA 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