一、前言:
在 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