1. 程式人生 > >解決Android中單個dex檔案中方法數越界的問題

解決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);
}

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

相關推薦

no