Android Gradle Plugin(AGP) 9.0 がリリースされ、大きめの変更が入っているので対応した時のメモになります。
掻い摘んだ内容になるので公式のリリースノートも参照ください。
KMP のプロジェクトの場合はここでは解説しませんが以下の記事を併せて参照することをお勧めします。
対応の流れ
AGP 9.0 更新は以下の流れで対応することになると思います。
- Gradle 9.1 以上に更新する
- AGP 9.0 に更新する
- AGP 9.0 で追加されたオプションを無効にする
- オプションを一つづつ有効にしていき、エラーが出れば修正していく
Android Studio の AGP Upgrade Assistant を使用することで 3 まで対応してくれるので、事前に使用してビルドが通るところまで確認できるとひとまず AGP の更新自体はできたことになります。
オプションを一つづつ解決していく
全ての変更点は以下のリンク先に記載されています。
オプションをひとまずオプトアウトさせると以下のような感じになると思います。(ここでオプトアウトしているオプションは全てではありません)
android.defaults.buildfeatures.resvalues=true
android.sdk.defaultTargetSdkToCompileSdkIfUnset=false
android.enableAppCompileTimeRClass=false
android.usesSdkInManifest.disallowed=false
android.uniquePackageNames=false
android.dependency.useConstraints=true
android.r8.strictFullModeForKeepRules=false
android.r8.optimizedResourceShrinking=false
android.builtInKotlin=false
android.newDsl=false
AGP 10 ではオプトアウトができなくなるので、少しずつでも解決していくことをお勧めします。
いくつか大体のプロジェクトで影響がありそうなオプションをピックアップして解説します。
android.defaults.buildfeatures.resvalues
以下のような Gradle 内で定義しているリソースがデフォルトで無効になるオプションです。
defaultConfig {
resValue("string", "api_url", "https://api.example.com")
}
リソースを定義したい場合はそのモジュール内で個別に有効にします。
buildFeatures {
resValues = true
}
ちなみにプロジェクトでデフォルトが無効かつモジュールでも無効の場合に resValue を使うとビルド時にエラーが出ます。
android.sdk.defaultTargetSdkToCompileSdkIfUnset
targetSdkVersion が設定されていない場合のデフォルトの挙動が変わるオプションです。
これまでは未設定の場合には compileSdkVersion が使われていましたが、このオプションを有効にすると明示的な設定が必要になります。
android.enableAppCompileTimeRClass
R class の扱いを、アプリでもライブラリと同じ方式に統一するオプションで、有効にすると R class の id が final ではなくなります。
Java で R class の id を switch 文で使用している場合に final でなくなると使用できなくなるため、単純な if 文にする必要が出てきます。
android.usesSdkInManifest.disallowed
AndroidManifest で SDK バージョンの指定を禁止するオプションです。
最近は Gradle 側で定義するのでこのオプションを有効にして受ける影響はあまりないでしょう。
android.uniquePackageNames
モジュール間でパッケージ名を一意にすることを強制するオプションです。
モジュール内のクラスの配置するパッケージではなく、モジュールの namespace で重複がある場合は一意にしましょう。
android.dependency.useConstraints
構成間の依存関係の制約をどのビルドで適用するかのオプションで、これを無効にすると AndroidTest 以外では制約が使われなくなります。
これは依存関係の解決をプロジェクト全体で行われていたものを、アプリやテストでそれぞれ解決するようになるというものです。
android.proguard.failOnMissingFiles
getDefaultProguardFile() に渡しているファイルが存在しない場合にビルドエラーなるオプションです。
android.r8.strictFullModeForKeepRules
R8 がクラスを保持する場合でもデフォルトコンストラクタを自動的に保持しないようになるオプションです。
これを有効にしつつデフォルトコンストラクタを保持させたい場合は -keep class A を -keep class A { <init>(); } に書き換える必要があります。
android.r8.optimizedResourceShrinking
クラスと Android リソースをまとめて分析することでこれまで以上に R8 が最適化をするようになるオプションです。
android.r8.proguardAndroidTxt.disallowed
getDefaultProguardFile() が proguard-android.txt ではなく proguard-android-optimize.txt のみをサポートするようになるオプションです。
android.r8.globalOptionsInConsumerRules.disallowed
ライブラリやモジュールに含まれる Proguard の設定に特定のルールを許可しないオプションです。
ライブラリの提供者は dontoptimize や dontobfuscate のような特定のルールを Proguard に含めず配布する必要があります。
そういったルールが含まれたライブラリを使用するアプリ側では、特定のルールが無視されてビルドされるようになります。
android.builtInKotlin
Build in Kotlin を有効にするオプションです。
モジュール単位での Build in Kotlin 移行も可能になっています。
詳細なマイグレーション手順は以下のリンク先を参照ください。
Build in Kotlin を使用しつつ最新の Kotlin を使いたい場合は以下のように buildscript に設定します。
buildscript {
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KOTLIN_VERSION")
classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
android.newDsl
2026/1/17 現在、Dagger/Hilt 2.58 が AGP 9.0 の newDsl に対応していないので、Hilt を使っている場合にこのオプションは有効にできません。
AGP が提供する API の裏側を新しい API に切り替えるオプションです。
これを有効にした場合は新しい DSL に実装を追従させる必要があります。
また、プロジェクトの構成次第(Composite Build の使用など)ではこれを有効にする前に android.builtInKotlin を有効にする必要があります。
こちらに関しては Hilt の問題が解決次第、追記か別記事を書こうと思います。