ユーザ用ツール

サイト用ツール


dexindexoverflowexception_通称65k問題_の対応

DexIndexOverflowExceptionについて

メソッド数が65k(65536)を超えると下記のビルドエラーが発生します。
ライブラリ等のメソッド数も含まれるため、大きめのライブラリをいくつか使用しているとわりと遭遇する。

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

ProGuardを有効にする

ProGuardを有効にすることで、使用していないメソッドの削除と最適化を行うことが出来ます。

android {
  buildTypes {
    release {
      // Proguardを有効にする
      minifyEnabled true
      // Proguardルールファイル proguard-rules-debug.pro を指定する。
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro'
    }
  }
}

MultiDexのSupportライブラリで対応する

ProGuardの他に、サポートライブラリで対応することも出来ます。
こちらはメソッドの定義ファイルを分割することで、65k以上のメソッドを使用可能にしてるみたいでProguardとは考え方が違うようです。
サポートライブラリはビルドツールv21.1.0以上から利用可能です。
・build.gradle

android {
  buildToolsVersion "21.1.0"
  
  defaultConfig {
    ...
    // Enabling multidex support.
    multiDexEnabled true
  }
}

dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

Applicationクラスを実装している場合は、継承をMultiDexApplicationに変更し、attachBaseContextをOverrideする。
・MyApp.java

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

Applicationクラスを実装していない場合は、AndroidManifestの<application>にMultiDexApplicationを指定する。
・AndroidManifest.xml

<application
  ...
  android:name="android.support.multidex.MultiDexApplication">
  ...
</application>

multidexビルドが遅い場合の対応

minSdkVersion が21 以上の場合と21 未満の場合では、multidex の仕組みが異なり ます。 minSdkVersion 21 以上であればART 環境で実行されることが保証できるため、ARTが もっている複数のdexファイルを一つのoat ファイルにまとめる機能を前提とすることが できます。そのため、クラス間の依存を気にせずに複数のdexファイルへ分割を行うこと ができます。 minSdkVersion 21 未満の場合はDalvik 環境で実行される可能性があるため、ひとつ目 のdex ファイルのみでアプリを起動し、その中の処理でふたつ目以降のdexファイルを読 み込む処理を実行する必要があります。ひとつ目のdex ファイルに入れておかなければな らないクラスとふたつ目以降のdexファイルでも問題のないクラスを、クラスの依存関係 を解析したうえで適切に振り分ける必要があります。 この解析処理は時間がかかるため、minSdkVersionが21未満のアプリでmultidexを有 効化する場合は別途minSdkVersionが21のProduct Flavorを追加し普段の開発はこの追 加したProduct Flavorで行うのがお勧めです。
(引用:Android実践プログラミング)

ビルド時にJavaヒープがOutOfMemoryを起こす場合

・Android Studioの設定を変更する
32bitの場合
IDEルート\bin\studio.exe.vmoptions
64bitの場合
IDEルート\bin\studio64.exe.vmoptions
上記をエディタで開き、「-XX:MaxPermSize=512m」に設定

・ビルド時のdexオプションを設定する

android {
  dexOptions {
    incremental true
    jumboMode true
    javaMaxHeapSize "4g"
  }
}

参考URL

dexindexoverflowexception_通称65k問題_の対応.txt · 最終更新: 2015/12/02 10:03 by sou