Android Gradle プラグイン 9.0.1(2026 年 1 月)

Android Gradle プラグイン 9.0 は、API と動作の変更を伴うメジャー リリースです。

Android Gradle プラグイン 9.0.1 に更新するには、Android Gradle プラグイン Upgrade Assistant を使用します。AGP Upgrade Assistant は、プロジェクトをアップグレードする際に、必要に応じて既存の動作を維持するのに役立ちます。そのため、AGP 9.0 の新しいデフォルトをすべて採用する準備ができていなくても、プロジェクトをアップグレードして AGP 9.0 を使用できます。

アップグレード プロセスを容易にするために、2 つのエージェント スキルも用意されています。KMP 以外のアプリの場合は、Android スキル リポジトリの AGP 9 アップグレード スキルをお試しください。KMP アプリの場合は、JetBrains の AGP 9 アップグレード スキルをお試しください。Android Studio でスキルを使用する方法については、スキルを使用してエージェント モードを拡張するをご覧ください。

互換性

Android Gradle プラグイン 9.0 がサポートする最大 API レベルは API レベル 36.1 です。その他の互換性に関する情報は次のとおりです。

最小バージョン デフォルトのバージョン 備考
Gradle 9.1.0 9.1.0 詳細については、Gradle のアップデートをご覧ください。
SDK Build Tools 36.0.0 36.0.0 SDK Build Tools をインストールまたは設定します。
NDK なし 28.2.13676358 別のバージョンの NDK をインストールまたは設定します。
JDK 17 17 詳細については、JDK バージョンの設定をご覧ください。
Kotlin Gradle プラグイン(KGP) 2.2.10 2.2.10 詳細については、Kotlin Gradle プラグインへのランタイム依存関係をご覧ください。

android DSL クラスは、新しい公開インターフェースのみを実装するようになりました。

過去数年間、Google は、どの API を公開するかをより適切に制御するために、DSL と API の新しいインターフェースを導入してきました。AGP バージョン 7.x と 8.x では、インターフェースの作業が進むにつれて互換性を維持するために、新しい公開インターフェースも実装した古い DSL タイプ(BaseExtension など)が引き続き使用されていました。

AGP 9.0 では、新しい DSL インターフェースのみが使用され、実装は完全に非表示の新しいタイプに変更されています。これにより、非推奨となった古い Variant API へのアクセスも削除されます。

AGP 9.0 に更新するには、次の操作が必要になる場合があります。

  • プロジェクトが組み込みの Kotlin と互換性があることを確認する: org.jetbrains.kotlin.android プラグインは新しい DSL と互換性がありません。
  • KMP プロジェクトを KMP 用 Android Gradle ライブラリ プラグインに切り替える: com.android.library プラグインおよび com.android.application プラグインと同じ Gradle サブプロジェクトで org.jetbrains.kotlin.multiplatform プラグインを使用することは、新しい DSL と互換性がありません。

  • ビルドファイルを更新する: インターフェースの変更は、DSL をできるだけ類似したものに保つことを目的としていますが、小さな変更がいくつかある可能性があります。

  • 新しい DSL と API を参照するようにカスタムビルド ロジックを更新します。内部 DSL への参照を、公開 DSL インターフェースに置き換えます。ほとんどの場合、これは 1 対 1 の置き換えになります。applicationVariants などの API の使用を、新しい androidComponents API に置き換えます。androidComponents API は、プラグインの互換性をより長く維持するために、より安定するように設計されているため、これはより複雑になる可能性があります。例については、Gradle のレシピをご覧ください。

  • サードパーティ製プラグインを更新する: 一部のサードパーティ製プラグインは、公開されなくなったインターフェースや API に依存している可能性があります。AGP 9.0 と互換性のあるバージョンのプラグインに移行します。

新しい DSL インターフェースに切り替えると、プラグインと Gradle ビルド スクリプトで、次のような非推奨の API を使用できなくなります。

android ブロック内の非推奨の API 関数 交換
applicationVariants、
libraryVariants、
testVariants、
unitTestVariants
プラグインが AGP に新しい機能を追加するための拡張ポイント。 これを androidComponents.onVariants API に置き換えます。例:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
以前のすべての API に直接置き換えられるものがあるとは限りません。 新しいバリアント API でカバーされていないユースケースがある場合は、問題を報告してください。
variantFilter 選択したバリアントを無効にできます。 これを androidComponents.beforeVariants API に置き換えます。例:
androidComponents {
    beforeVariants(
        selector()
            .withBuildType("debug")
            .withFlavor("color", "blue")
    ) { variantBuilder ->
        variantBuilder.enable = false
    }
  }
deviceProvider、
testServer
Android デバイスとエミュレータに対してテストを実行するためのカスタム テスト環境の登録。 Gradle で管理されているデバイスに切り替えます。
sdkDirectory、
ndkDirectory、
bootClasspath、
adbExecutable、
adbExe
カスタムタスクに Android SDK のさまざまなコンポーネントを使用する。 androidComponents.sdkComponents に切り替えます。
registerArtifactType、
registerBuildTypeSourceProvider、
registerProductFlavorSourceProvider、
registerJavaArtifact、
registerMultiFlavorSourceProvider、
wrapJavaSourceSet
主に Android Studio での生成されたソースの処理に関連する、廃止された機能。AGP 7.2.0 で動作しなくなりました。 これらの API の直接的な代替 API はありません。
dexOptions dx ツールに関連する古い設定。d8 に置き換えられました。Android Gradle プラグイン 7.0 以降、どの設定も効果がありません。 直接の代替はありません。
generatePureSplits Instant App 用の構成分割を生成します。 設定分割を配布する機能が Android App Bundle に組み込まれました。
aidlPackagedList このライブラリに依存するライブラリとアプリの API として公開するために、AAR にパッケージ化する AIDL ファイル。 これは LibraryExtension では引き続き公開されますが、他の拡張機能タイプでは公開されません。

AGP 9.0 に更新して次のエラー メッセージが表示された場合は、プロジェクトがまだ古いタイプの一部を参照していることを意味します。

java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension

互換性のないサードパーティ製プラグインによってブロックされている場合は、オプトアウトして、DSL の古い実装と古い Variant API を復元できます。この間、新しいインターフェースも利用可能であり、独自のビルド ロジックを新しい API に更新することもできます。オプトアウトするには、gradle.properties ファイルに次の行を追加します。

android.newDsl=false

また、より段階的な移行を行うために、AGP 9.4 では個々のモジュールをオプトアウトできます。方法については、バリアント API モジュールのオプトアウトをご覧ください。

以前のクラスは AGP 9.0 で非推奨としてマークされています。つまり、newDsl フラグを無効にしたプロジェクトでは、android ブロック自体を含め、非推奨の警告が表示されます。

AGP 9.0 にアップグレードする前に、新しい API へのアップグレードを開始することもできます。新しいインターフェースは多くの AGP バージョンに存在しているため、新旧のインターフェースを混在させることができます。AGP API リファレンス ドキュメントには、各 AGP バージョンの API サーフェスと、各クラス、メソッド、フィールドが追加された時期が記載されています。

Google は、よく使用されるプラグインの作成者に連絡を取り、新しいモードと完全に互換性のあるプラグインを適応させてリリースできるよう支援しています。また、Android Studio の AGP Upgrade Assistant を引き続き強化して、移行をガイドします。

新しい DSL または Variant API に機能が不足している場合は、できるだけ早く問題を報告してください。

組み込みの Kotlin

Android Gradle プラグイン 9.0 では、組み込みの Kotlin サポートが導入され、デフォルトで有効になっています。つまり、Kotlin ソースファイルをコンパイルするために、ビルドファイルに org.jetbrains.kotlin.android(または kotlin-android)プラグインを適用する必要がなくなりました。これにより、Kotlin と AGP の統合が簡素化され、非推奨の API の使用が回避され、場合によってはパフォーマンスが向上します。

そのため、プロジェクトを AGP 9.0 にアップグレードする場合は、組み込みの Kotlin に移行するか、オプトアウトする必要があります。

Kotlin ソースがない Gradle サブプロジェクトに対して、組み込みの Kotlin サポートを選択的に無効にすることもできます。

Kotlin Gradle プラグインへのランタイム依存関係

組み込みの Kotlin サポートを提供するため、Android Gradle プラグイン 9.0 は Kotlin Gradle プラグイン(KGP)2.2.10 にランタイム依存するようになりました。つまり、KGP バージョンを宣言する必要がなくなりました。2.2.10 より前の KGP バージョンを使用している場合、Gradle は KGP バージョンを 2.2.10 に自動的にアップグレードします。同様に、2.2.10-2.0.2 より前の KSP バージョンを使用している場合、AGP は KGP バージョンに合わせて 2.2.10-2.0.2 にアップグレードします。

より新しい KGP バージョンにアップグレードする

より新しいバージョンの KGP または KSP を使用するには、最上位のビルドファイルに次の行を追加します。

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
    }
}

下位の KGP バージョンにダウングレードする

KGP バージョンをダウングレードできるのは、組み込みの Kotlin を無効にしている場合のみです。これは、AGP 9.0 では組み込みの Kotlin がデフォルトで有効になっており、組み込みの Kotlin には KGP 2.2.10 以降が必要であるためです。

以前のバージョンの KGP または KSP を使用するには、厳密なバージョン宣言を使用して、最上位のビルドファイルでそのバージョンを宣言します。

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("KGP_VERSION") }
        }

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

ダウングレードできる KGP の最小バージョンは 2.0.0 です。

テスト フィクスチャの IDE サポート

AGP 9.0 では、テスト フィクスチャが Android Studio IDE で完全にサポートされるようになりました。

Fused Library プラグイン

Fused Library Plugin(プレビュー版)を使用すると、複数のライブラリを 1 つの Android ライブラリ AAR として公開できます。これにより、ユーザーが公開されたアーティファクトに依存しやすくなります。

スタートガイドについては、統合ライブラリを使用して複数の Android ライブラリを 1 つとして公開するをご覧ください。

動作の変更

Android Gradle プラグイン 9.0 の新しい動作は次のとおりです。

動作 推奨事項
Android Gradle プラグイン 9.0 は、デフォルトで NDK バージョン r28c を使用します。 使用する NDK バージョンを明示的に指定することを検討してください。
Android Gradle プラグイン 9.0 では、デフォルトで、ライブラリのコンシューマが同じかそれ以降のコンパイル SDK バージョンを使用する必要があります。 ライブラリを使用する場合は、同じかそれ以降のコンパイル SDK を使用します。 これが不可能な場合や、公開するライブラリのユーザーに切り替えのための時間を与えたい場合は、AarMetadata.minCompileSdk を明示的に設定します。

AGP 9.0 では、次の Gradle プロパティのデフォルトが更新されています。これにより、アップグレード時に AGP 8.13 の動作を維持するかどうかを選択できます。

プロパティ 関数 AGP 8.13 から AGP 9.0 への変更 推奨事項
android.newDsl android ブロックの以前の実装を公開せずに、新しい DSL インターフェースを使用します。
これは、android.applicationVariants などの以前のバリアント API にアクセスできなくなったことも意味します。
false → true オプトアウトするには、android.newDsl=false を設定します。
プロジェクトで使用するすべてのプラグインとビルド ロジックに互換性がある場合は、オプトアウトを削除します。
android.builtInKotlin 組み込みの Kotlin を有効にします。 false → true 可能であれば、組み込みの Kotlin に移行するか、オプトアウトしてください。
android.uniquePackageNames 各ライブラリに一意のパッケージ名が設定されるようにします。 false → true プロジェクト内のすべてのライブラリに一意のパッケージ名を指定します。 それが不可能な場合は、移行中にこのフラグを無効にできます。
android.useAndroidx デフォルトで androidx 依存関係を使用します。 false → true androidx 依存関係を導入します。
android.default.androidx.test.runner デフォルトで androidx.test.runner.AndroidJUnitRunner クラスを使用してデバイス上のテストを実行します。非推奨の InstrumentationTestRunner のデフォルトを置き換えます。
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
false → true AndroidJUnitRunner を採用するか、カスタム testInstrumentationRunner を明示的に指定します。
android.dependency.useConstraints 構成間の依存関係制約の使用を制御します。
AGP 9.0 のデフォルトは false で、アプリケーション デバイス テスト(AndroidTest)でのみ制約を使用します。 これを true に設定すると、8.13 の動作に戻ります。
true → false 依存関係の制約は、必要な場合を除き、どこでも使用しないでください。 このフラグの新しいデフォルトを受け入れると、プロジェクトのインポート プロセスでも最適化が有効になります。これにより、Android ライブラリ サブプロジェクトが多数あるビルドのインポート時間が短縮されます。
android.enableAppCompileTimeRClass アプリケーションのコードを、非 final の R クラスに対してコンパイルし、アプリケーションのコンパイルをライブラリのコンパイルに合わせます。
これにより、インクリメンタリティが向上し、リソース処理フローのパフォーマンスを将来的に最適化するための道が開かれます。
false → true 多くのプロジェクトでは、ソースを変更せずに新しい動作を採用できます。 R クラスのフィールドが、switch case など、定数を必要とする場所で使用されている場合は、連鎖 if ステートメントを使用するようにリファクタリングします。
android.sdk.defaultTargetSdkToCompileSdkIfUnset アプリとテストのターゲット SDK バージョンのデフォルト値として、コンパイル SDK バージョンを使用します。
この変更前は、ターゲット SDK バージョンはデフォルトで最小 SDK バージョンに設定されていました。
false → true アプリとテストのターゲット SDK バージョンを明示的に指定します。
android.onlyEnableUnitTestForTheTestedBuildType テスト対象のビルドタイプの単体テスト コンポーネントのみを作成します。
デフォルトのプロジェクトでは、デバッグ用の単体テストが 1 つ作成されます。以前の動作では、デバッグ用またはリリース用の単体テストが実行されていました。
false → true プロジェクトでデバッグとリリースの両方でテストを実行する必要がない場合は、変更は必要ありません。
android.proguard.failOnMissingFiles AGP DSL で指定された保持ファイルがディスク上に存在しない場合、エラーでビルドが失敗します。この変更前は、ファイル名に誤字があると、ファイルが暗黙的に無視されていました。 false → true 無効な ProGuard ファイル宣言を削除します。
android.r8.optimizedResourceShrinking クラスと Android リソースを一緒に考慮することで、R8 が保持する Android リソースを減らすことができます。 false → true プロジェクトの保持ルールがすでに完了している場合は、変更は必要ありません。
android.r8.strictFullModeForKeepRules クラスが保持されるときにデフォルトのコンストラクタを暗黙的に保持しないことで、R8 が保持する量を減らすことができます。 つまり、-keep class A は -keep class A { <init>(); }
を意味しなくなりました。
false → true プロジェクトの保持ルールがすでに完了している場合は、変更は必要ありません。

デフォルトのコンストラクタを保持する必要がある場合は、プロジェクトの保持ルールで -keep class A を -keep class A { <init>(); } に置き換えます。
android.defaults.buildfeatures.resvalues すべてのサブプロジェクトで resValues を有効にします。 true → false resValues を必要とするサブプロジェクトでのみ有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のように設定します。
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders すべてのサブプロジェクトでシェーダー コンパイルを有効にします。 true → false コンパイル対象のシェーダーを含むサブプロジェクトでのみシェーダー コンパイルを有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のように設定します。
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed AGP 9.0 では、getDefaultProguardFile() は proguard-android.txt ではなく proguard-android-optimize.txt のみをサポートします。これは、proguard-android.txt に含まれる ­dontoptimize フラグが誤って使用されるのを防ぐためです。 false → true 最適化を回避する場合は、proguard-android-optimize.txt を使用するとともに、カスタム proguardFile で ­dontoptimize を明示的に指定できます。可能であれば、このファイルから ­dontoptimize フラグを削除してください。このフラグがあると、R8 の最適化のメリットが減少します。そうでない場合は、android.r8.globalOptionsInConsumerRules.disallowed=false を設定してオプトアウトします。
android.r8.globalOptionsInConsumerRules.disallowed AGP 9.0 以降では、コンシューマーのキープファイルに問題のある Proguard 構成が含まれていると、Android ライブラリと機能モジュールの公開が失敗します。­dontoptimize や ­dontobfuscate などのグローバル オプションを含むコンシューマー キープ ファイルは、アプリケーション モジュールでのみ使用する必要があります。ライブラリ ユーザーの最適化のメリットが減少する可能性があります。Android アプリ モジュールのコンパイルでは、プリコンパイルされた依存関係(JAR または AAR)に埋め込まれている場合、このようなグローバル オプションは暗黙的に無視されます。この問題が発生したかどうかは、configuration.txt(通常は <app_module>/build/outputs/mapping/<build_variant>/configuration.txt のようなパスにあります)で、# REMOVED CONSUMER RULE: ­dontoptimize のようなコメントを確認することで確認できます。 false → true 公開済みのライブラリでは、互換性のないルールを削除する必要があります。内部ライブラリは、互換性がないものの必要なルールを、アプリ モジュールの proguardFile に移動する必要があります。android.r8.globalOptionsInConsumerRules.disallowed=false を設定してオプトアウトします。すべての一般ユーザー向け Keep ファイルに互換性があることを確認したら、オプトアウトを削除します。
android.sourceset.disallowProvider AndroidSourceSet DSL を使用して、生成されたソースのプロバイダを渡すことを禁止します。 false → true androidComponents で Sources API を使用して、生成されたソースを登録します。
android.custom.shader.path.required シェーダーのコンパイルが有効になっている場合、シェーダー コンパイラのパスを local.properties で明示的に設定する必要があります。 false → true プロジェクトの local.properties に glslc.dir=/path/to/shader-tools を追加します。

削除された機能

Android Gradle プラグイン 9.0 では、次の機能が削除されています。

  • Wear OS アプリの埋め込みのサポート
    AGP 9.0 では、Wear OS アプリの埋め込みのサポートが削除されました。これは、Google Play でサポートされなくなったためです。これには、wearApp 構成と AndroidSourceSet.wearAppConfigurationName DSL の削除が含まれます。Wear OS にアプリを公開する方法については、Wear OS への配信をご覧ください。
  • androidDependencies と sourceSets のレポートタスク
  • 密度分割 APK のサポート
    AGP 9.0 では、画面密度に基づく分割 APK の作成のサポートが削除されました。この機能と関連する API は削除されました。AGP 9.0 以降を使用して画面密度に基づいて分割 APK を分割するには、App Bundle を使用します。

変更された DSL

Android Gradle プラグイン 9.0 では、DSL に次の互換性を破る変更が加えられています。

  • CommonExtension のパラメータ化が削除されました。

    これ自体は、将来のソースレベルの互換性を破る変更を回避するためのソースレベルの互換性を破る変更にすぎませんが、ブロック メソッドを CommonExtension から ApplicationExtension、LibraryExtension、DynamicFeatureExtension、TestExtension に移動する必要があることも意味します。

    プロジェクトを AGP 9.0 にアップグレードする場合は、これらのパラメータまたはブロック メソッドを使用する Gradle プラグイン コードをリファクタリングします。たとえば、次のプラグインは、type パラメータを削除し、削除されたブロック メソッドに依存しないように更新されています。

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    AGP 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    さまざまな AGP バージョンをターゲットとするプラグインの場合、ゲッターを直接使用すると、9.0 より前の AGP バージョンとのバイナリ互換性が確保されます。

DSL を削除しました

Android Gradle プラグイン 9.0 では、以下が削除されます。

削除された API

Android Gradle プラグイン 9.0 では、以下が削除されます。

削除された Gradle プロパティ

次の Gradle プロパティは、デフォルトで有効になっている機能をグローバルに無効にする方法として最初に追加されました。

これらの機能は、AGP 8.0 以前からデフォルトで無効になっています。これらの機能は、それらを使用するサブプロジェクトでのみ有効にして、ビルドを効率化します。

プロパティ 関数 交換
android.defaults.buildfeatures.aidl すべてのサブプロジェクトで AIDL コンパイルを有効にします。 AIDL ソースが存在するサブプロジェクトでのみ AIDL コンパイルを有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のプロパティを設定します。
android {
  buildFeatures {
    aidl = true
  }
}
AIDL ソースを含む各サブプロジェクトの Gradle ビルドファイル内
android.defaults.buildfeatures.renderscript すべてのサブプロジェクトで RenderScript のコンパイル を有効にします。 renderscript ソースが存在するサブプロジェクトでのみ renderscript のコンパイルを有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のプロパティを設定します。
android {
  buildFeatures {
    renderScript = true
  }
}

適用される Gradle プロパティ

次の Gradle プロパティを設定すると、AGP 9.0 でエラーがスローされます。

Android Gradle プラグイン Upgrade Assistant は、これらのプロパティを使用するプロジェクトを AGP 9.0 にアップグレードしません。

プロパティ 関数
android.r8.integratedResourceShrinking リソースの圧縮は常に R8 の一部として実行されるようになり、以前の実装は削除されました。
android.enableNewResourceShrinker.preciseShrinking リソースの圧縮で、常に正確なリソース圧縮が使用されるようになり、より多くのリソースを削除できるようになりました。

R8 の変更

AGP 9.0.0 には、次の R8 の変更が含まれています。

新しい構成オプション -processkotlinnullchecks

Kotlin の null チェックを処理するように R8 を構成するための新しい R8 オプション -processkotlinnullchecks を追加しました。このオプションには、keep、remove_message、remove の 3 つの値のいずれかである必須の引数を指定します。このオプションは、Kotlin コンパイラによって追加された次の null チェックを処理します。

class kotlin.jvm.internal.Intrinsics {
  void checkNotNull(java.lang.Object);
  void checkNotNull(java.lang.Object, java.lang.String);
  void checkExpressionValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkNotNullExpressionValue(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkFieldIsNotNull(java.lang.Object, java.lang.String);
  void checkFieldIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkParameterIsNotNull(java.lang.Object, java.lang.String);
  void checkNotNullParameter(java.lang.Object, java.lang.String);
}

オプション値は、弱いものから強いものの順に並べられ、次のような効果があります。

  • keep はチェックを変更しません。
  • remove_message は、各 check メソッド呼び出しを、呼び出しの最初の引数に対する getClass() の呼び出しに書き換えます(実質的に null チェックは保持されますが、メッセージは表示されません)。
  • remove はチェックを完全に削除します。

デフォルトでは、R8 は remove_message を使用します。-processkotlinnullchecks を指定すると、この設定はオーバーライドされます。複数回指定した場合は、最も強い値が使用されます。

コンパニオン メソッドへの keep 情報の伝播を停止

以前は、keep ルールが脱糖の対象となるインターフェース メソッドに一致すると、R8 は内部で最適化を許可しないビットと圧縮を許可しないビットを合成コンパニオン メソッドに転送していました。

AGP 9.0 以降、コンパニオン メソッドに keep ルールが適用されなくなりました。これは、keep ルールが他のコンパイラ合成フィールド/メソッド/クラスに適用されないという事実と一致しています。

最適化を許可しないビットと縮小を許可しないビットをコンパニオン メソッドに転送することで、以前は次のユースケースがサポートされていました。

  1. default/static/private インターフェース メソッドを含むライブラリを、minSdk < 24 の DEX と、インターフェース メソッドを保持するルールを使用してコンパイルします。
  2. クラスパスと -applymapping にライブラリを指定してアプリをコンパイルします。
  3. アプリとライブラリをマージします。

disallow obfuscation ビットはコンパニオン メソッドに転送されないため、これは -applymapping でのみ機能します。つまり、ステップ 1 で生成されたコンパニオン クラスのメソッド名は難読化されます。

今後、このユースケースは minSdk < 24 ではサポートされなくなります。この問題を回避するには、次の操作を行います。

  1. default/static/private インターフェース メソッドを含むライブラリを、minSdk < 24 のクラスファイルに脱糖します。
  2. R8 と、コンパニオン クラスのインターフェース メソッドを保持するルールを使用して、脱糖されたアーティファクトをコンパイルします。
  3. クラスパス上のライブラリを使用してアプリをコンパイルします。
  4. アプリと脱糖されたアーティファクトをマージします。

このもう 1 つの副作用として、インターフェース コンパニオン メソッド内の匿名クラスとローカルクラスの内部クラス属性と囲みメソッド属性を保持できなくなりました。

デフォルトの出力ソースファイルを r8-map-id-<MAP_ID> に変更する

この変更は、8.12.0 以降の AGP に適用されます。

再トレースが必要な場合(難読化または最適化が有効になっている場合)、クラスのデフォルトの出力ソースファイル属性が SourceFile から r8-map-id-<MAP_ID> に変更されます。

難読化されたスタック トレースが指定されている場合、新しいソースファイル属性を使用すると、再トレースに必要なマッピング ファイルの ID を抽出できます。これは、Logcat でのスタック トレースの自動再トレースをサポートするために使用できます。

カスタム ソース ファイル属性(-renamesourcefileattribute)が使用されている場合、このカスタム ソース ファイル属性が引き続き優先されます。

ProGuard 互換モード(gradle.properties に android.enableR8.fullMode=false が含まれている場合)では、r8-map-id-<MAP_ID> のソースファイル属性を出力しても、SourceFile 属性が保持されていない場合にのみ有効になります。ProGuard 互換モードを使用し、スタック トレースにマッピング ファイル ID を含めるアプリは、-keepattributes SourceFile を削除する(または R8 フルモードに移行する)必要があります。

r8-map-id-<MAP_ID> で使用されるマップ ID は、完全なマップハッシュであり、以前に使用されていたマップハッシュの 7 文字の接頭辞ではありません。

L8 脱糖で最小化された合成名の使用を有効にする

D8 によって生成された合成クラスの名前には、通常、$$ExternalSynthetic という部分文字列が含まれています。これは、D8 によって生成された合成クラスであることを示しています。さらに、合成の名前は合成の種類(Backport、Lambda など)もエンコードします。クラス名が文字列プールでより多くのスペースを占有するため、結果として DEX サイズに悪影響を及ぼします。

AGP 9.0 は、すべての j$ クラスを含む DEX ファイルが合成クラスに新しい短縮クラス名形式を使用するように、L8(コアライブラリの脱糖)を構成します。新しいクラス名には数値 ID(例: $1)が使用されます。

-addconfigurationdebugging のサポートを削除

AGP 9.0 では、-addconfigurationdebugging のサポートが削除されました。このフラグが使用されている場合、コンパイラは警告を報告するようになりました。

D8/R8 からの L8 ルール生成のサポートを削除

この変更は、D8/R8 コマンドラインまたは API を直接使用しているデベロッパーにのみ関係します。

R8 9.0 では、D8 と R8 から L8 のキープルールを生成するサポートが削除されました。この目的には、代わりに TraceReferences を使用する必要があります。

具体的には、メソッド D8Command.builder.setDesugaredLibraryKeepRuleConsumer と R8Command.Builder.setDesugaredLibraryKeepRuleConsumer が削除され、D8 と R8 のコマンドライン オプションから --desugared-lib-pg-conf-output のサポートが削除されています。

解決済みの問題

Android Gradle プラグイン 9.0.0

修正された問題
Android Gradle プラグイン
機能リクエスト: 理想的な AGP バージョンをプロパティとして挿入
SingleArtifact.VERSION_CONTROL_INFO_FILE を安定化
androidTest connectedCheck の logcat 出力が破損している
AGP の組み込み Kotlin サポートが Kotlin ソースセットと同期しない
missingDimensionStrategy は、無関係なディメンションからでも、独自の名前に一致するフレーバーを優先します。
AGP の組み込み Kotlin サポートが Kotlin ソースセットと同期しない
AGP 9.0.0-rc01 で kotlin() 関数を介して Kotlin ライブラリが解決されない
Built-in-kotlin が Maven pom で kotlin-stdlib 依存関係制約を公開しない
compileSdk と targetSdk の不一致に関するテストケースを追加
resConfigs の値が空の場合、aapt エラーが不明瞭になる
純粋な Java プロジェクトが kotlin stdlib に依存している。
AGP 9.0 で非推奨の KotlinMultiplatformAndroidCompilationBuilder プロパティを削除
「com.android.tools.build:gradle:9.0.0-alpha05」に KGP と gradle-api への API 依存関係が必要
com.android.experimental.built-in-kotlin Gradle プラグインの名前を変更
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` が機能しない
compile Sdk の AAR メタデータ チェックで古い DSL が使用されている
非推奨の `com.android.build.api.dsl.ManagedDevices.devices` プロパティを削除
AGP の組み込み Kotlin サポートが Kotlin ソースセットと同期しない
コンシューマーの keep ファイルに -dontobfuscate が含まれている場合、Android ライブラリの公開に失敗する
最適化されたリソースのマッピングを印刷するオプションがない
このフェーズが終了した後に finalizeDsl を呼び出すとエラーになるようにしました
Jetifier が無効になっている場合でも、AGP が Jetifier 構成を初期化する
`kotlin.stdlib.default.dependency` がモジュール ファイルと pom ファイルに対して true の場合、Kotlin でビルドしても kotlinStdlib がコンパイル時の依存関係として追加されない
新しい最適化 DSL で configuration.txt がデフォルトで作成されない
AGP 8.13.0 でモジュールのナビゲーション グラフを検証できない
AGP が非推奨の Gradle API(マルチ文字列表記)を使用している
minSdkVersion >=21 で以前の multidex ライブラリを使用しようとしているユーザーに警告を表示する
コード生成タスクがある場合にビルドが失敗する
`android.builtInKotlin=false`、`android.newDsl=false`、`android.enableLegacyVariantApi=false` の場合、`kotlin-android` プラグインを使用すると「API 'applicationVariants' is obsolete」というエラーが発生する
kotlin.stdlib.default.dependency=false の場合、組み込みの Kotlin がバージョン管理されていない kotlin-stdlib を解決できない
DexData がファイルを閉じずに開き、クリーンアップを妨げる
AndroidSourceDirectorySet が AGP 9.0 で PatternFilterable の拡張を停止する必要がある
テスト専用モジュールでのテスト フィクスチャ エラー
テスト フィクスチャでコンテキスト レシーバを使用すると、誤ったエラーが発生する
testFixtures の Kotlin コードで不正確な IDE エラーが発生する
「legacy-kapt」プラグインは、「kotlin-kapt」とは異なり、アノテーション処理をスキップします
compileSdkSpec.minorApiLevel が SettingsExtension で機能しない
[fused lib - public] 生成された融合ライブラリにソースが含まれていない
extractNativeLibs と useEmbeddedDex はマニフェストから取得しないでください
AGP 9.0.0-alpha09 の R8 からの警告
AGP 9.0 で非推奨の AndroidSourceSet.jni を削除
AGP 9.0 で Installation.installOptions() を削除
AGP 9.0 で BuildType.isRenderscriptDebuggable を削除。
android.defaults.buildfeatures.renderscript を削除
`com.android.kotlin.multiplatform.library` が Gradle で管理されているデバイスでクラッシュする
`android.defaults.buildfeatures.aidl` のデフォルトの gradle.properties フラグを削除
ProGuard ファイルが存在しない場合にビルドを失敗させる
buildconfig のデフォルトの gradle.properties フラグを削除
アプリの targetSdk のデフォルト値を、minSdk ではなく compileSdk に基づくように変更
「isIncludeAndroidResources」が有効になっている場合、AGP 8.12.0 で「process{Variant}UnitTestManifest」が tools:overrideLibrary の使用をマージできない
AGP が JVM テストタスクの Gradle で非推奨の警告を発生させる
DependencyReportTask が構成キャッシュに対応していない
AGP 9.0 でデフォルトのソース/ターゲット Java バージョンを Java 8 から Java 11 に切り替え
android.useAndroidX のデフォルトを true に変更
組み込みの Kotlin で kapt プラグインを適用する際の例外処理を改善しました。
android.proguard.failOnMissingFiles が consumerProguardFiles で機能しない
Kotlin Gradle プラグインの依存関係を 2.2.10 に更新
KGP API を使用して KotlinJvmAndroidCompilation を作成する
テストソースに適用される Kotlin の明示的な API モード
lint
AGP 8.11.0: apply(from = "...") を使用して .gradle.kts ファイルを適用すると、lintAnalyzeRelease タスクがクラッシュする
Lint チェックの SdkIntAtLeast チェックで、アノテーション付きの値が正しいかどうかがチェックされない
組み込みの Kotlin が .kotlin_module を META-INF に追加しない
Lint クラスパスに、異なるバージョンの重複するクラスが含まれている
プライベート リソースのオーバーライドの回避策が機能しない(tools:override = "true")
バグ: 未使用のリソースを削除しても、その翻訳は削除されず、削除するかどうかを尋ねるメッセージも表示されない
Lint が「Could not clean up K2 caches」という警告をスローする
Lint が「Could not clean up K2 caches」という警告をスローする
lint の統合
AndroidLintAnalysisTask で、systemPropertyInputs.javaVersion の差異により、異なる JDK ベンダーまたはマイナー バージョン間でキャッシュミスが発生する
Lint が compileSdk に関係なく、インストールされている最新の SDK を自動的に使用し、タスク入力として登録せず、キャッシュを破損する
圧縮ツール(R8)
final リソース ID を使用している場合、R8 で最適化されたリソースの圧縮がサイレント エラーになる