通常一個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);
}
通過以上修改,則可以順利編譯通過了。