方法數超過 64K怎麼辦 使用 multidex 來解決

一、前言:

在 Android 中,有一個限制,那就是整個應用的方法不能超過 65536,否則就會出現編譯錯誤,並且程序也無法成功地安裝到手機上。當項目日益龐大後這個問題就比較容易遇到,Google 提供了 multidex 方案專門用於解決這個問題,通過一個 dex 文件拆分爲多個 dex 文件來避免單個 dex 文件方法數越界的問題。

使用 CrashHandler 來獲取應用的 crash 信息

在 Android 中單個 dex 文件所能夠包含的最大方法數是 65536,這包含了 Android FrameWork、依賴的 jar 包以及應用本身的代碼中的所有方法。65536是一個很大的數,一般一個簡單應用的方法很難達到65536,但是對於一些較大型的應用來說,65536 方法就很容易達到了。

異常如下:

he number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html   
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 

二、解決 方法超過65536:

1. 基本配置

app中build.gradle中添加

//開啓分包
multiDexEnabled true
//依賴:支持多個dex和依賴multidex庫。
compile 'com.android.support:multidex:1.0.1';

apply plugin: 'com.android.application'
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.function.luo.demo"
        minSdkVersion 24
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        // Enabling multidex support.
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
     //分包依賴
    compile 'com.android.support:multidex:1.0.1'
}

基本配置完成後,實現方案有三種方案可以選

2. 方案一:在 manifest 文件中指定 Application 爲 MultiDexApplication:

如下所示:

<application
android:name="android.support.multidex.MultiDexApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ...
</application>

3. 方案二:讓應用的 Application 繼承 MultiDexApplication:

如下所示:

public class MyAppliction extends MultiDexApplication {
    ...
}

4. 方案三:如果不想讓應用的 Application 繼承 MultiDexApplication,還可以選擇重寫 Application 的 attachBaseContext 方法,這個方法比 Application 的 onCreate 要先執行:

如下所示:

public class MyAppliction extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

對於一個使用 multidex 方案的應用,採用了上面的配置項,如果應用的方法數沒有越界,那麼 Gradle 並不會生成多個 dex 文件,如果方法數越界後,Gradle 就會在 apk 中打包 2 個或多個 dex 文件,具體會打多少個 dex 文件要看當前項目代碼的規模。

三、Mutlidex 可能出現的問題:

1. Mutlidex帶來的侷限性:

  • 應用啓動速度會降低,由於應用啓動時會加載額外的 dex 文件,這將導致應用的啓動速度降低,甚至可能出現 ANR 現象,尤其是其它 dex 文件較大的時候,因此要避免生成較大的 dex 文件。
  • 由於 Dalvik linearAlloc 的 bug,這可能導致使用 multidex 的應用無法在 Android 4.0 以前的手機上運行,因此需要做大量的兼容性測試。也可能在應用中採用multidex方案從而產生大量的內存消耗的情況,這會導致應用的崩潰。
  • Dex文件安裝到設備的過程非常複雜,如果第二個Dex文件太大,可能導致應用無響應。此時應該使用ProGuard減小Dex文件的大小。

2. 與此同時可能會報java.lang.OutOfMemoryError: Java heap space錯誤:

那麼解決方法是:在app的build.gradle中android中添加如下代碼

//加大java堆內存大小
dexOptions {
   javaMaxHeapSize "4g"//這裏2g或者4g都可以
}


原文鏈接:https://blog.csdn.net/gongxiaoou/article/details/81281415

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章