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