1. 程式人生 > >解決Android 5.0以下出現 java.lang.NoClassDefFoundError,找不到類

解決Android 5.0以下出現 java.lang.NoClassDefFoundError,找不到類

本文參考自:http://www.jianshu.com/p/8b4f711da0bb

問題的主要原因:方法數超65536限制。

由於實際開發當中的需求不斷變更,開源框架越來越多,大多都用第三方SDK,導致方法數很容易超出65536限制。出現錯誤java.lang.NoClassDefFoundError,

例如:

java.lang.NoClassDefFoundError:uk.co.senab.photoview.PhotoViewAttacher

測試6.0手機沒問題,4.4上面就有問題了。導致出現以上錯誤崩潰。

當我跟進去走debug的時候 ,其實發現這個類並沒有什麼毛病。

這個錯誤是Android應用的方法總數限制造成的。Android平臺的Java虛擬機器Dalvik在執行DEX格式的Java應用程式時,使用原生型別short來索引DEX檔案中的方法。這意味著單個DEX檔案可被引用的方法總數被限制為65536。通常APK包含一個classes.dex檔案,因此Android應用的方法總數不能超過這個數量,這包括Android框架、類庫和你自己開發的程式碼。而Android 5.0和更高版本使用名為ART的執行時,它原生支援從APK檔案載入多個DEX檔案。在應用安裝時,它會執行預編譯,掃描classes(..N).dex檔案然後將其編譯成單個.oat檔案用於執行. 通熟的講,就是分包。

那麼Android5.0以下怎麼分包.解決超出方法數限制問題

解決方法:

一、配置build.gradle (app)

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId ""
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0.0"
        multiDexEnabled true
}
dependencies {
   compile 'com.android.support:multidex:1.0.0'
}

二、使用自定義的Application繼承MultiDexApplication這個類,或者重寫Application的方法attachBaseContext(),並呼叫MultiDex.install();

@Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }

三、到專案的根目錄下執行 ./gradlew clean build

關於使用android-support-multidex解決Dex超出方法數的限制問題,還可以參考:

作者:時之沙
Android 使用android-support-multidex解決Dex超出方法數的限制問題,讓你的應用不再爆棚

本文為記錄Android開發當中的一些坑.希望能幫到大家