Android StudioのDebugビルドでD8がクラッシュし、ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 31が表示されることがあります。GoogleはIssue #545349635で、R8 8.8.34から8.9.27の間に生じた回帰として追跡し、Android Gradle Plugin(AGP)9.3.3の修正一覧に掲載しています。
代表的なログ
Execution failed for task ':app:mergeExtDexDebug'.
java.lang.ArrayIndexOutOfBoundsException:
Index -1 out of bounds for length 31
タスク名はプロジェクトによりmergeProjectDexDebug、mergeExtDexDebug、dexBuilderDebugなどに変わります。重要なのは、Debug用のDEX変換中にD8スタックトレースと同じ範囲外アクセスが現れる点です。
原因
D8はJava/KotlinのバイトコードをAndroid Runtime向けDEXへ変換します。このエラーはアプリ配列の添字ミスではなく、特定の入力バイトコードをDebugモードで処理するD8内部の回帰です。そのため、例外のlength 31を手掛かりにアプリの配列処理を修正しても通常は解決しません。
Googleの公開修正タイトルは「R8 8.8.34と8.9.27の間の回帰」と明記していますが、公開情報だけで中間のすべてのR8版が影響すると断定はできません。修正版として公式に確認できるAGPは9.3.3です。
発生条件・対象バージョン
- DebugバリアントのビルドでD8によるDEX変換が実行される
- 問題を含むR8/D8が特定のクラスまたは依存ライブラリを処理する
- ログに
Index -1 out of bounds for length 31とD8関連タスクが現れる
AGPは対応するR8/D8を同梱するため、通常はR8だけを差し替えるのではなくAGPを修正版へ更新します。AGP 9.3系の要件はGradle 9.5.0以上、JDK 17です。
推奨する解決手順
- 完全なスタックトレースを取得する:失敗したDebugタスクを
--stacktrace付きで再実行し、D8内部であることを確認します。 - AGP 9.3.3以降へ更新する:プラグイン定義またはVersion CatalogのAGPを修正版へ変更します。
- GradleとJDKを整合させる:AGP 9.3ではGradle 9.5.0以上とJDK 17を使用します。
- 古いDEX出力を消して再ビルドする:Gradleデーモン停止とcleanの後、同じDebugタスクを実行します。
gradlew --stop
gradlew clean
gradlew assembleDebug --stacktrace
[versions]
agp = "9.3.3"
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
更新できない場合の代替策
短期的には、問題発生前にプロジェクトとCIで動作確認済みだったAGP/Gradle一式へ戻し、バージョンを固定します。また、依存関係を一つずつ直前の版へ戻して原因入力を特定できれば、そのライブラリ更新を保留する選択肢もあります。
Gradleキャッシュの削除は壊れた中間生成物を除外する切り分けにはなりますが、D8本体の回帰を修正しません。非公式にR8だけを強制差し替える方法はAGPとの互換性が保証されないため、第一選択にはしないでください。
確認方法
gradlew --versionで実際のGradleとJDKを確認します。- 依存関係とAGPの解決バージョンをCIでも同じにします。
assembleDebugを実行し、該当DEXタスクが完了することを確認します。- 生成APKを端末またはEmulatorへインストールし、起動と主要画面を確認します。
注意点
Index -1 out of boundsでも、アプリ実行時に自作コードから出る例外は別問題です。本件はビルド中のD8クラッシュです。- 既存の「Index 0 out of bounds for length 0」というR8問題とはエラー値と原因が異なります。
- AGP更新後に最小Gradle版エラーが出た場合は、Wrapperも対応版へ更新してください。
まとめ
Debugビルド中のD8でArrayIndexOutOfBoundsException: Index -1 out of bounds for length 31が出る場合、アプリの配列処理ではなくD8回帰の可能性があります。公式に修正が確認できるAGP 9.3.3以降へ更新し、Gradle 9.5.0以上・JDK 17と組み合わせたうえで、clean後に同じDebugビルドを検証してください。
