PC パソコン

Android Studio「java.lang.NoClassDefFoundError: kotlin.Unit」の原因と解決方法【R8・Android 4.4】

AGP 9.2.0~9.4.0系でR8を有効にしたアプリがAndroid 4.4(KitKat)で起動すると、java.lang.NoClassDefFoundError: kotlin.Unitや、R8が生成した合成クラスのメソッドを解決できないログを出してクラッシュすることがあります。Google Issue TrackerでP1として修正された、legacy multidexのmain DEX配置とR8アウトライン処理に関する不具合です。修正版はAndroid Gradle Plugin 9.4.1です。

代表的なエラーログ

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app
java.lang.NoClassDefFoundError: kotlin.Unit
    at com.example.app.KioskApplication.attachBaseContext(...)
    at android.app.Application.attach(Application.java:181)
    at android.app.Instrumentation.newApplication(...)

別の再現では、次のようにR8が生成した合成クラスのメソッドを起動時に解決できません。

Could not find method j.i, referenced from method androidx.multidex.MultiDex.<clinit>
VFY: unable to resolve static method:
Lj;.i(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/StringBuilder;

原因

Android 4.4以前は、起動時に必要なクラスをprimary DEXへ収めるlegacy multidexが必要です。問題のR8では、文字列連結などを合成アウトラインクラスへ移動した後、そのクラスまたは参照先をmain DEXへ正しく保持できない場合がありました。アプリのApplicationやandroidx.multidex.MultiDexがsplit DEXのロード前にそのコードへ到達すると、クラス検証またはクラスロードに失敗します。

報告ではAGP 9.2.0で発生し、AGP 9.3.1および9.4.0/R8 9.4.17でも継続しました。AGP 9.4.0ではkotlin.Unitが見つからない形でも再現しています。

切り分け:同じNoClassDefFoundErrorでも、依存関係からKotlin標準ライブラリを除外した場合や、通常の難読化keepルール不足は別原因です。本件はAndroid 4.4のlegacy multidexでのみ再現し、AGP更新前後で結果が変わることが重要な手掛かりです。

発生条件・対象バージョン

  • Android Gradle Plugin 9.2.0~9.4.0系と、そこに含まれる影響対象のR8を使用している。
  • minSdkが20以下で、Android 4.4端末にlegacy multidexとしてインストールする。
  • R8による縮小・最適化を有効にしたビルドで発生する。
  • Application.attachBaseContext()やMultiDex初期化など、secondary DEXロード前のコードが影響を受ける。

GoogleはIssue #506912893を修正済みとし、Android Studio Quail 4 | 2026.1.4 Patch 1とAndroid Gradle Plugin 9.4.1で修正を提供したと明記しています。

推奨する解決手順

1. AGPを9.4.1以降へ更新する

plugins {
    id("com.android.application") version "9.4.1" apply false
    id("com.android.library") version "9.4.1" apply false
}

バージョンカタログを使う場合は、libs.versions.toml側のAGPバージョンを9.4.1以降へ変更します。AGP 9.4.1が要求するGradle・JDK・SDK Build Toolsとの互換性も公式リリース情報で確認してください。

2. 古い生成物を削除してRelease APKを再生成する

./gradlew --stop
./gradlew clean
./gradlew :app:assembleRelease

古いR8が生成したDEXやマッピングを再利用しないよう、修正版AGPで最初からビルドします。既存のAPK/AABをそのまま再配布しても修正されません。

3. Android 4.4実機またはAPI 19エミュレータで起動確認する

新しいAndroidだけでなく、問題が発生したAPI 19環境でコールドスタートを確認します。Application初期化、MultiDex導入、最初のActivity表示まで進むことを確認してください。

すぐ更新できない場合の代替策

  • 公式Issueで正常だったAGP 9.1.1へ一時的に戻し、依存関係とSDK要件を再確認する。
  • Android 4.4のサポートを終了できる製品ではminSdkを21以上にし、legacy multidex経路を使わない。
  • 問題のReleaseを配布せず、修正版ツールチェーンで再ビルドできるまで直前の正常版を維持する。

-keep class kotlin.Unitやmain DEX keepルールだけでは、R8が生成した合成クラス自体がprimary DEXから欠落する再現を完全には回避できないと公式Issueで報告されています。keepルールを恒久解決として断定せず、AGP更新を優先してください。

確認方法

  1. ./gradlew -versionと依存レポートで実際のAGP/R8構成を記録します。
  2. AGP 9.4.1以降へ更新後、Release APK/AABをクリーンビルドします。
  3. API 19端末へ新規インストールし、アプリを完全終了した状態から複数回起動します。
  4. LogcatにNoClassDefFoundError、Could not find method、VFY: unable to resolveがないことを確認します。
  5. 必要ならAPK Analyzerでprimary DEXに起動時必須クラスが含まれるか比較します。

注意点

  • デバッグビルドやAndroid 5.0以降だけの確認では、legacy multidex固有の問題を見逃します。
  • Kotlinライブラリを手動追加するだけでは、R8のmain DEX配置不具合は直りません。
  • minSdkを上げる判断は、実利用端末とサポート方針を確認してから行ってください。
  • 修正版へ更新後も発生する場合は、R8 full-mode、独自keepルール、依存関係の除外を別途調査してください。

まとめ

Android 4.4でのみjava.lang.NoClassDefFoundError: kotlin.Unitや合成クラスの解決失敗が起き、AGP 9.2.0~9.4.0系のR8を使っている場合は、legacy multidexの既知不具合が有力です。推奨解決策はAGP 9.4.1以降へ更新し、Release成果物をクリーンビルドしてAPI 19で再確認することです。

参照した公式情報