PC パソコン

Android Studio「IllegalStateException: targetCompatibility is not yet finalized」の解決方法

Android Studioで独自GradleプラグインやbuildSrcからAndroidのbootClasspathへアクセスすると、構成フェーズ中に「IllegalStateException: targetCompatibility is not yet finalized」でビルドが停止することがあります。Googleはこの問題をIssue #461382865として追跡し、Android Gradle Plugin(AGP)9.2.0で修正済みとしています。

代表的なエラーログ

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> java.lang.IllegalStateException:
  targetCompatibility is not yet finalized

スタックトレースには、カスタムプラグイン、buildSrc、Convention Plugin、またはbootClasspathを参照する処理が現れる場合があります。完全なクラス名や呼び出し元は構成によって異なります。

原因

AGPはDSL解析、finalizeDsl()、Variant作成、タスク作成という順に設定値を確定します。修正前のAGPでは、設定がまだ確定していない段階でbootClasspathへアクセスするだけでも、内部でtargetCompatibilityの値を必要として例外になる場合がありました。Googleの公式リリースノートでは「Error when accessing (but not evaluating) bootClasspath」と説明されています。

バージョン情報: この問題の修正版はAGP 9.2.0です。公式の公開情報は最初に問題が入ったAGPバージョンを明記していないため、旧版すべてが影響を受けるとは断定できません。

発生条件

  • AGPの修正を含まないバージョンを利用している
  • 独自プラグイン、buildSrc、Convention PluginなどがAndroidのbootClasspathを構成フェーズで参照する
  • Providerを保持するだけの意図でも、AGP内部で値が早期に確定・参照される経路に入る

通常のアプリだけでなく、ビルドロジックを共有するマルチモジュールプロジェクトやサードパーティ製プラグイン経由でも発生し得ます。

推奨する解決手順

  1. スタックトレースで呼び出し元を特定します。
    ./gradlew assembleDebug --stacktrace

    buildSrc、社内プラグイン、外部プラグインのどれがbootClasspathへ触れているか確認します。

  2. AGP 9.2.0以降へ更新します。 AGP 9.2の公式互換表に合わせ、Gradle Wrapperは9.4.1以上、Gradle JVMはJDK 17を使用します。
  3. ビルドロジックを遅延評価へ移行します。 構成フェーズで値をget()したりリストへ即時変換したりせず、AGPのVariant APIとGradleのProviderを通じてタスク入力へ接続します。
  4. デーモンを停止して再実行します。
    ./gradlew --stop
    ./gradlew clean
    ./gradlew assembleDebug --stacktrace

ビルドロジック側の修正例

次のような構成フェーズ中の即時取得は避けます。

// 避ける例:構成時に値を確定させる
val files = android.bootClasspath.files
tasks.register("inspectBootClasspath") {
    doLast { println(files) }
}

使用しているAGP APIがProviderを返す場合は、値を保持したままタスク入力へ接続し、実行時まで解決を遅らせます。具体的な型はAGPバージョンで異なるため、公開Variant APIのリファレンスに合わせて実装してください。

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

AGPをすぐ更新できない場合は、問題を起こすカスタムプラグインを最新版へ更新するか、bootClasspathへのアクセスをタスク実行時まで遅らせます。サードパーティ製プラグインが呼び出し元なら、該当機能を一時的に無効化する方法もありますが、公式に確認された恒久修正はAGP 9.2.0への更新です。

afterEvaluateで強制的に遅らせる方法は、構成キャッシュや将来のAGPとの互換性を損ねる可能性があります。GoogleはAGPの拡張に公式Variant APIを使用し、AGP内部タスクへ直接依存しないことを推奨しています。

確認方法

  • ./gradlew assembleDebug --stacktraceが例外なしで完了する
  • Releaseビルドと対象のカスタムタスクも実行できる
  • ./gradlew --versionでAGP 9.2と互換性のあるGradle/JDK構成を確認する
  • 構成キャッシュを利用するプロジェクトでは、連続2回のビルドでも問題が再発しないことを確認する

注意点

エラーメッセージだけを見てsourceCompatibilityやtargetCompatibilityへ同じ値を追記しても、早すぎるAPIアクセスが原因なら根本解決になりません。スタックトレースで呼び出し元を確認し、AGP更新とビルドロジックの遅延化を優先してください。

まとめ

「targetCompatibility is not yet finalized」は、bootClasspathを設定確定前に扱う経路で発生したAGPの既知問題です。AGP 9.2.0以降へ更新し、独自ビルドロジックではProviderと公式Variant APIを使って値の解決を遅らせるのが推奨対応です。

参照した公式情報