[Android] AGP更新地獄:JDK・Kotlin・依存関係の噛み合わせ

スポンサーリンク
  1. 導入:AGP更新は「コード修正」じゃなくて「整合性調整」
  2. まず押さえる:AGP更新で壊れる“典型パターン”
    1. パターン1:GradleとAGPの組み合わせが合ってない
    2. パターン2:JDKが合ってない(特にCIとローカル差)
    3. パターン3:KotlinとAGP/Compose/プラグインの噛み合わせが崩れる
    4. パターン4:依存関係が解決できない(Repository/バージョン競合)
  3. 切り分けの鉄則:上から順に固定する
  4. JDK整合性:まずここを揃える
    1. チェック1:Gradleが使っているJDKは何?
    2. チェック2:CIのJDKと一致している?
    3. チェック3:Kotlin JVM target と Java target がズレてない?
  5. Gradle Wrapper:AGP更新とセットで上げる
  6. Kotlin整合性:プラグイン・Compose・KSP/KAPTが絡む
    1. 典型エラー:Kotlinコンパイラ周り
    2. 対策:Kotlinとプラグインをまとめて管理する
  7. 依存関係:AGP更新で露呈する“古い依存”
    1. よくある壊れ方
    2. まずやる:依存ツリーの可視化
    3. 次にやる:バージョン固定(依存の揺れを止める)
  8. 落ちやすいポイント集(実務で遭遇しがち)
    1. 1) Kotlin/JDK target mismatch
    2. 2) KAPT/KSPのバージョン不一致
    3. 3) R8/Proguardの挙動差(debugは通るがreleaseで落ちる)
    4. 4) リポジトリ/ミラーの差(CIだけ依存が取れない)
  9. 安全な更新手順(実務のおすすめ)
  10. デバッグ/確認チェックリスト
  11. よくある質問(Q&A)
    1. Q. AGPだけ上げたい。Kotlinは据え置きでいい?
    2. Q. CIだけ落ちる時、何から見る?
    3. Q. debugは通るのにreleaseで落ちる
  12. まとめ:AGP更新は「噛み合わせ」を直す作業

導入:AGP更新は「コード修正」じゃなくて「整合性調整」

AGP(Android Gradle Plugin)を更新すると、だいたいこうなります。

  • 昨日までビルドできてたのに突然エラー
  • 依存関係が解決できない
  • Kotlinのターゲットが合わない
  • JDKが違うと言われる

これ、AGPが悪いというより、周辺の噛み合わせが崩れただけのことがほとんどです。

AGP更新は「IDEアップデート」や「SDK上げ」とセットで起こることも多く、原因が散らばります。

この記事では、AGP更新で壊れがちなポイントを依存関係・JDK・Kotlinの整合性に絞って、切り分けの順番を整理します。

先に結論(3行)です。

  • AGP更新は「Gradle」「JDK」「Kotlin」をセットで見ないと詰む
  • まずツールチェーン(JDK/Gradle/AGP)を固定し、次に依存を直す
  • エラーは1個ずつ潰す。まとめて上げると地獄

まず押さえる:AGP更新で壊れる“典型パターン”

壊れ方はだいたいパターン化しています。

パターン1:GradleとAGPの組み合わせが合ってない

AGPはGradle本体のバージョンに強く依存します。
AGPだけ上げてGradle Wrapperを放置すると、普通にビルドが死にます。

パターン2:JDKが合ってない(特にCIとローカル差)

ローカルはJDK 17、CIはJDK 11、みたいなズレがあると、AGP更新で突然顕在化します。
「自分のPCだけ通る」「CIだけ落ちる」はこのパターンが多いです。

パターン3:KotlinとAGP/Compose/プラグインの噛み合わせが崩れる

Kotlinのバージョンは、AGPだけでなく Compose Compiler や各プラグインとも絡みます。
ここがズレると、ビルドは通ってもタスク実行時に落ちたりします。

パターン4:依存関係が解決できない(Repository/バージョン競合)

Mavenの解決戦略が変わったり、古い依存が新しい環境に対応していなかったりで詰みます。
特にマルチモジュールは連鎖します。

切り分けの鉄則:上から順に固定する

AGP更新で詰まった時、やるべき順番があります。

  • 1) JDK(Java toolchain / Gradle JVM)
  • 2) Gradle Wrapper(gradle-wrapper.properties)
  • 3) AGP(com.android.tools.build:gradle)
  • 4) Kotlin(kotlin-gradle-plugin)
  • 5) 依存関係(AndroidX/各SDK/Compose等)

いきなり「依存のエラー」から直すと、根っこがJDKだったりして無限ループになります。
まず土台を固定。これが最優先です。

JDK整合性:まずここを揃える

最近のAGP更新で一番多い地雷が、JDK周りです。

チェック1:Gradleが使っているJDKは何?

Android Studioの設定でGradle JVMがどれを指しているか確認します。
ローカルで複数JDKが入っている場合、ここがズレます。

チェック2:CIのJDKと一致している?

CIだけ落ちるなら、まずJDKが違うと思っていいです。
CI側のJavaバージョンを固定し、ローカルと揃えます。

チェック3:Kotlin JVM target と Java target がズレてない?

AGP更新で「compileOptionsは17なのに、kotlinOptionsは1.8」みたいなズレが顕在化します。
このズレは、地味に起動時クラッシュやClassNotFoundの原因になります。

Gradle Wrapper:AGP更新とセットで上げる

AGP更新は、基本的にGradle Wrapperの更新とセットです。

この時にやりがちなのが、

  • ローカルのGradleだけ更新してWrapperを更新しない
  • Wrapper更新したけど、CIが古いGradleを使っている

Wrapperは「プロジェクトのビルド環境の固定」です。
AGP更新の時は、まずWrapperを揃えてから進めます。

Kotlin整合性:プラグイン・Compose・KSP/KAPTが絡む

Kotlinは「1個上げればOK」ではありません。
AGP更新と一緒に上げると、次のどれかが爆発しがちです。

  • Kotlin Gradle Plugin
  • KSP / KAPT
  • Compose Compiler
  • 各種プラグイン(Firebase, Hilt, Navigationなど)

典型エラー:Kotlinコンパイラ周り

症状としては、compileKotlinタスクで落ちたり、Composeのコンパイルで落ちたりします。
「Kotlinのバージョンに対して、このプラグインが未対応」みたいな状態です。

対策:Kotlinとプラグインをまとめて管理する

versions.toml や buildSrc でバージョン管理を一本化し、ズレを作らないのが最終的に一番楽です。
マルチモジュールでは特に。

依存関係:AGP更新で露呈する“古い依存”

AGP更新は、依存関係の古さを炙り出します。

よくある壊れ方

  • 古いsupport系や古いAndroidXが混ざっている
  • 依存のバージョン競合(同じgroupの別バージョン)
  • 古いSDKが新しいcompileSdk/targetSdkに未対応

まずやる:依存ツリーの可視化

何が競合しているかは、依存ツリーを出すと一発で見えることがあります。

./gradlew :app:dependencies

マルチモジュールなら、落ちているモジュール単位で出すのがコツです。

次にやる:バージョン固定(依存の揺れを止める)

依存が揺れていると、マシンや時間で結果が変わります。
まずはBOM(Firebase/Composeなど)を使う、あるいはバージョンを固定して再現性を上げます。

落ちやすいポイント集(実務で遭遇しがち)

1) Kotlin/JDK target mismatch

Java 17でコンパイルしてるのに、Kotlinが1.8ターゲットのまま、など。
このズレはコンパイルエラーだけでなく、実行時の不整合も呼びます。

2) KAPT/KSPのバージョン不一致

AGP更新でGradleタスクが変わると、KAPTタスクやKSPタスクが爆発します。
「Kotlinは上げたがKSPが追従してない」がありがちです。

3) R8/Proguardの挙動差(debugは通るがreleaseで落ちる)

AGP更新でR8の挙動が変わり、releaseでだけClassNotFoundが出ることがあります。
この場合は keep ルールの不足を疑います。

4) リポジトリ/ミラーの差(CIだけ依存が取れない)

社内ミラーやネットワーク制限が絡むと、依存取得でコケます。
リポジトリ順や認証設定の差が原因になりやすいです。

安全な更新手順(実務のおすすめ)

AGP更新で事故らないための手順をまとめます。

  • Step 1:JDKを固定(ローカル/CI)
  • Step 2:Gradle Wrapperを更新
  • Step 3:AGPを更新(まずは1段階)
  • Step 4:Kotlinを更新(対応する範囲で)
  • Step 5:依存の競合を解決
  • Step 6:releaseビルドも必ず通す

「全部一気に上げる」は、原因が追えなくなるので避けたいです。

デバッグ/確認チェックリスト

  • Gradleが使っているJDKがローカル/CIで一致している
  • Gradle Wrapperのバージョンを更新した
  • AGPとGradleの組み合わせが破綻していない
  • Kotlin/JDK targetが揃っている
  • KSP/KAPT/Composeなど周辺プラグインの整合性が取れている
  • 依存ツリーを出して競合を潰した
  • debugだけでなくreleaseでもビルド/起動確認した

よくある質問(Q&A)

Q. AGPだけ上げたい。Kotlinは据え置きでいい?

可能な場合もありますが、周辺プラグインがKotlinに依存しているため、結果的にKotlinも上げざるを得ないことが多いです。
「据え置きで通るならOK」ですが、通らないならKotlin側の整合性を見た方が早いです。

Q. CIだけ落ちる時、何から見る?

まずJDKです。次にGradle Wrapperが同じか。
依存取得のネットワーク条件も含めて、ローカルと差分が出やすいのはここです。

Q. debugは通るのにreleaseで落ちる

R8/Proguardの影響が濃厚です。keepルール不足や、リフレクションを使うSDKの設定を疑います。
AGP更新で“たまたま通ってた”ものが壊れることがあります。

まとめ:AGP更新は「噛み合わせ」を直す作業

  • AGP更新で壊れる原因は整合性の崩れが大半
  • JDK → Gradle → AGP → Kotlin → 依存の順で固定する
  • 一気に上げず、1つずつ潰して再現性を保つ

迷ったら:JDKとWrapperを先に揃える。
ここが揃うだけで、地獄の8割は回避できます。

コメント

タイトルとURLをコピーしました