解決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開發當中的一些坑.希望能幫到大家