天天看點

解決Android中單個dex檔案中方法數越界的問題

通常一個Android應用中單個dex檔案所能包含的最大方法數為65536個,這包含FrameWork、依賴的第三方jar包以及應用本身代碼中的所有方法。

一般來說一個簡單的應用裡面的方法很難達到65536這個值,但是對于一些比較大型的項目來說,65536也是比較容易達到的,一旦應用的方法數達到65536後,編譯器就無法正常完成編譯工作了并會抛出類似這樣的異常:

UNEXPECTED TOP-LEVEL EXCEPTION:

com.android.dex.DexIndexOverflowException:method ID not in [0, 0xffff]:65536

還有一種情況是,方法數沒有達到65536,編譯也正常編譯通過了,但是在低版本的手機上安裝時卻出現了異常終止:

E/dalvikvm : Optimization failed

E/installd : dexopt failed on '/data/dalvik-cache/[email protected]@[email protected]' res=63282

...

這是因為應用在安裝時會通過一個dexopt的程式來優化dex檔案,并且在優化過程中dexopt通常會給應用一個8M或16M的緩存區,但是在Android2.2和2.3中通常隻有5MB,是以會出現盡管應用中的方法沒有超過65536個,但是其存儲空間可能有超過5MB,這時候就會出現這樣的問題,導緻安裝失敗。

是以如何解決這樣的問題呢?

在Android5.0以前需要引入Google提供的android-support-multidex.jar,這個jar包可以在SDK目錄下的extras/android/support/multidex/library/libs下面找到。

5.0以後:(AndroidStudio)

一、修改工程目錄下的build.gradle檔案:

defaultConfig {
    applicationId "com.xxx.xxx"
    minSdkVersion 14
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    multiDexEnabled true//解決方法數量超過65536個時無法編譯的問題
}      
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:multidex:1.0.0'
}      

二、在代碼中添加支援multidex的功能(三種方法)

1、在manifest檔案中指定Application為MultiDexApplication,如:

<application
    android:name="android.support.multidex.MultiDexApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"      

2、讓應用的Application繼承MultiDexApplication,如:

public class App extends MultiDexApplication {......}      

3、重寫Application的attachBaseContext方法(該方法比onCreate要先執行):

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

通過以上修改,則可以順利編譯通過了。