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 の使用を、新しいandroidComponentsAPI に置き換えます。androidComponentsAPI は、プラグインの互換性をより長く維持するために、より安定するように設計されているため、これはより複雑になる可能性があります。例については、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) } } |
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. |
android ブロックの以前の実装を公開せずに、新しい DSL インターフェースを使用します。これは、 android.applicationVariants などの以前のバリアント API にアクセスできなくなったことも意味します。
|
false → true |
オプトアウトするには、android.newDsl=false を設定します。プロジェクトで使用するすべてのプラグインとビルド ロジックに互換性がある場合は、オプトアウトを削除します。 |
android. |
組み込みの Kotlin を有効にします。 | false → true |
可能であれば、組み込みの Kotlin に移行するか、オプトアウトしてください。 |
android. |
各ライブラリに一意のパッケージ名が設定されるようにします。 | false → true |
プロジェクト内のすべてのライブラリに一意のパッケージ名を指定します。 それが不可能な場合は、移行中にこのフラグを無効にできます。 |
android. |
デフォルトで androidx 依存関係を使用します。 |
false → true |
androidx 依存関係を導入します。 |
android. |
デフォルトで androidx.test.runner.AndroidJUnitRunner クラスを使用してデバイス上のテストを実行します。非推奨の InstrumentationTestRunner のデフォルトを置き換えます。android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
AndroidJUnitRunner を採用するか、カスタム testInstrumentationRunner を明示的に指定します。 |
android. |
構成間の依存関係制約の使用を制御します。 AGP 9.0 のデフォルトは false で、アプリケーション デバイス テスト(AndroidTest)でのみ制約を使用します。
これを true に設定すると、8.13 の動作に戻ります。
|
true → false |
依存関係の制約は、必要な場合を除き、どこでも使用しないでください。 このフラグの新しいデフォルトを受け入れると、プロジェクトのインポート プロセスでも最適化が有効になります。これにより、Android ライブラリ サブプロジェクトが多数あるビルドのインポート時間が短縮されます。 |
android. |
アプリケーションのコードを、非 final の R クラスに対してコンパイルし、アプリケーションのコンパイルをライブラリのコンパイルに合わせます。 これにより、インクリメンタリティが向上し、リソース処理フローのパフォーマンスを将来的に最適化するための道が開かれます。 |
false → true |
多くのプロジェクトでは、ソースを変更せずに新しい動作を採用できます。 R クラスのフィールドが、switch case など、定数を必要とする場所で使用されている場合は、連鎖 if ステートメントを使用するようにリファクタリングします。 |
android. |
アプリとテストのターゲット SDK バージョンのデフォルト値として、コンパイル SDK バージョンを使用します。 この変更前は、ターゲット SDK バージョンはデフォルトで最小 SDK バージョンに設定されていました。 |
false → true |
アプリとテストのターゲット SDK バージョンを明示的に指定します。 |
android. |
テスト対象のビルドタイプの単体テスト コンポーネントのみを作成します。 デフォルトのプロジェクトでは、デバッグ用の単体テストが 1 つ作成されます。以前の動作では、デバッグ用またはリリース用の単体テストが実行されていました。 |
false → true |
プロジェクトでデバッグとリリースの両方でテストを実行する必要がない場合は、変更は必要ありません。 |
android. |
AGP DSL で指定された保持ファイルがディスク上に存在しない場合、エラーでビルドが失敗します。この変更前は、ファイル名に誤字があると、ファイルが暗黙的に無視されていました。 | false → true |
無効な ProGuard ファイル宣言を削除します。 |
android. |
クラスと Android リソースを一緒に考慮することで、R8 が保持する Android リソースを減らすことができます。 | false → true |
プロジェクトの保持ルールがすでに完了している場合は、変更は必要ありません。 |
android. |
クラスが保持されるときにデフォルトのコンストラクタを暗黙的に保持しないことで、R8 が保持する量を減らすことができます。
つまり、-keep class A は -keep class A { <init>(); }を意味しなくなりました。 |
false → true |
プロジェクトの保持ルールがすでに完了している場合は、変更は必要ありません。 デフォルトのコンストラクタを保持する必要がある場合は、プロジェクトの保持ルールで -keep class A を -keep class A { <init>(); } に置き換えます。
|
android. |
すべてのサブプロジェクトで resValues を有効にします。 |
true → false |
resValues を必要とするサブプロジェクトでのみ有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のように設定します。android {
buildFeatures {
resValues = true
}
} |
android. |
すべてのサブプロジェクトでシェーダー コンパイルを有効にします。 | true → false |
コンパイル対象のシェーダーを含むサブプロジェクトでのみシェーダー コンパイルを有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のように設定します。
android {
buildFeatures {
shaders = true
}
} |
android. |
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. |
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. |
AndroidSourceSet DSL を使用して、生成されたソースのプロバイダを渡すことを禁止します。 |
false → true |
androidComponents で Sources API を使用して、生成されたソースを登録します。 |
android. |
シェーダーのコンパイルが有効になっている場合、シェーダー コンパイラのパスを 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.wearAppConfigurationNameDSL の削除が含まれます。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 では、以下が削除されます。
AndroidSourceSet.jni(機能していなかったため)。AndroidSourceSet.wearAppConfigurationName。削除された埋め込み Wear OS アプリのサポートに関連しています。BuildType.isRenderscriptDebuggable(機能していなかったため)。DependencyVariantSelection。DependencySelectionに置き換えられました。これはkotlin.android.localDependencySelectionとして公開されています。Installation.installOptions(String)。Installation.installOptionsの可変プロパティに置き換えられます。試験運用版の
PostProcessingブロック(安定版にはならなかった)。ProductFlavor.setDimension。dimensionプロパティに置き換えられます。LanguageSplitOptions。これは、非推奨の Google Play Instant でのみ有用でした。DensitySplit。この機能はサポートされなくなりました。代替手段として App Bundle を使用します。
削除された API
Android Gradle プラグイン 9.0 では、以下が削除されます。
AndroidComponentsExtension.finalizeDSl。finalizeDslに置き換えられました。Component.transformClassesWith。Instrumentation.transformClassesWithに置き換えられました。Component.setAsmFramesComputationMode。Instrumentation.setAsmFramesComputationModeに置き換えられました。ComponentBuilder.enabled。ComponentBuilder.enableに置き換えられました。DependenciesInfoBuilder.includedInApk。includeInApkに置き換えられます。DependenciesInfoBuilder.includedInBundle。includeInBundleに置き換えられます。GeneratesApk.targetSdkVersion。targetSdkに置き換えられます。Variant.minSdkVersion。minSdkに置き換えられます。Variant.maxSdkVersion。maxSdkに置き換えられます。Variant.targetSdkVersion。targetSdkに置き換えられます。Variant.unitTest。com.android.testプラグインには適用されなかったためです。unitTestは、HasUnitTestを拡張するVariantBuilderサブタイプで使用できます。VariantBuilder.targetSdkとtargetSdkPreview。これらはライブラリでは意味がありません。代わりにGeneratesApkBuilder.targetSdkまたはGeneratesApkBuilder.targetSdkPreviewを使用してください。VariantBuilder.enableUnitTest。com.android.testプラグインには適用されなかったためです。enableUnitTestは、HasUnitTestBuilderを拡張するVariantBuilderサブタイプで使用できます。VariantBuilder.unitTestEnabledは削除され、HasUnitTestBuilderを拡張するVariantBuilderサブタイプでより一貫した名前のenableUnitTestが使用されるようになりました。VariantOutput.enable。enabledに置き換えられます。非推奨で無効になっている
FeaturePluginとFeatureExtension。非推奨となり無効化された
BaseExtension.registerTransformAPI。AGP 4.2 以前での実行をターゲットにしながら、最新の AGP バージョンでコンパイルできるようにするためにのみ残されていました。
削除された Gradle プロパティ
次の Gradle プロパティは、デフォルトで有効になっている機能をグローバルに無効にする方法として最初に追加されました。
これらの機能は、AGP 8.0 以前からデフォルトで無効になっています。これらの機能は、それらを使用するサブプロジェクトでのみ有効にして、ビルドを効率化します。
| プロパティ | 関数 | 交換 |
|---|---|---|
android. |
すべてのサブプロジェクトで AIDL コンパイルを有効にします。 |
AIDL ソースが存在するサブプロジェクトでのみ AIDL コンパイルを有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のプロパティを設定します。android {
buildFeatures {
aidl = true
}
} |
android. |
すべてのサブプロジェクトで RenderScript のコンパイル を有効にします。 |
renderscript ソースが存在するサブプロジェクトでのみ renderscript のコンパイルを有効にするには、それらのプロジェクトの Gradle ビルドファイルで次のプロパティを設定します。
android {
buildFeatures {
renderScript = true
}
} |
適用される Gradle プロパティ
次の Gradle プロパティを設定すると、AGP 9.0 でエラーがスローされます。
Android Gradle プラグイン Upgrade Assistant は、これらのプロパティを使用するプロジェクトを AGP 9.0 にアップグレードしません。
| プロパティ | 関数 |
|---|---|
android. |
リソースの圧縮は常に R8 の一部として実行されるようになり、以前の実装は削除されました。 |
android. |
リソースの圧縮で、常に正確なリソース圧縮が使用されるようになり、より多くのリソースを削除できるようになりました。 |
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 ルールが他のコンパイラ合成フィールド/メソッド/クラスに適用されないという事実と一致しています。
最適化を許可しないビットと縮小を許可しないビットをコンパニオン メソッドに転送することで、以前は次のユースケースがサポートされていました。
default/static/privateインターフェース メソッドを含むライブラリを、minSdk< 24 の DEX と、インターフェース メソッドを保持するルールを使用してコンパイルします。- クラスパスと
-applymappingにライブラリを指定してアプリをコンパイルします。 - アプリとライブラリをマージします。
disallow
obfuscation ビットはコンパニオン メソッドに転送されないため、これは -applymapping でのみ機能します。つまり、ステップ 1 で生成されたコンパニオン クラスのメソッド名は難読化されます。
今後、このユースケースは minSdk < 24 ではサポートされなくなります。この問題を回避するには、次の操作を行います。
default/static/privateインターフェース メソッドを含むライブラリを、minSdk< 24 のクラスファイルに脱糖します。- R8 と、コンパニオン クラスのインターフェース メソッドを保持するルールを使用して、脱糖されたアーティファクトをコンパイルします。
- クラスパス上のライブラリを使用してアプリをコンパイルします。
- アプリと脱糖されたアーティファクトをマージします。
このもう 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 プラグイン |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lint の統合 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 圧縮ツール(R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||