Android Gradle プラグイン 8.1.0(2023 年 7 月)

Android Gradle プラグイン 8.1.0 はメジャー リリースで、さまざまな新機能や改善措置が組み込まれています。

互換性

最小バージョン デフォルトのバージョン 備考
Gradle 8.0 8.0 詳細については、Gradle のアップデートをご覧ください。
SDK Build Tools 33.0.1 33.0.1 SDK Build Tools をインストールまたは設定します。
NDK なし 25.1.8937393 別のバージョンの NDK をインストールまたは設定します。
JDK 17 17 詳細については、JDK バージョンの設定をご覧ください。

Kotlin DSL がビルド構成のデフォルト

新しいプロジェクトでは、ビルド構成にデフォルトで Kotlin DSL(build.gradle.kts)が使用されるようになりました。これにより、構文のハイライト表示、コード補完、宣言へのナビゲーションなど、Groovy DSL(build.gradle)よりも優れた編集エクスペリエンスが実現します。AGP 8.1 と Kotlin DSL を使用してビルド構成を行う場合は、最適なエクスペリエンスを実現するために Gradle 8.1 を使用する必要があります。詳細については、Kotlin DSL 移行ガイドをご覧ください。

アプリ別の言語の自動サポート

Android Studio Giraffe Canary 7 および AGP 8.1.0-alpha07 以降では、アプリで自動的にアプリ別の言語設定をサポートするよう設定できます。Android Gradle プラグインは、プロジェクト リソースに基づいて LocaleConfig ファイルを生成し、そのファイルへの参照を最終マニフェスト ファイルに追加します。そのため、手動で行う必要はありません。AGP は、アプリ モジュールの res フォルダ内のリソースと、ライブラリ モジュールの依存関係を使用して、LocaleConfig ファイルに含めるロケールを決定します。

自動のアプリ別の言語機能は、Android 13(API レベル 33)以降を実行するアプリをサポートしています。この機能を使用するには、compileSdkVersion を 33 以上に設定する必要があります。以前のバージョンの Android のアプリ別の言語設定を設定するには、API とアプリ内言語選択ツールを使用する必要があります。

アプリ別の言語の自動サポートを有効にするには、デフォルトの言語 / 地域を指定します。

  1. アプリ モジュールの res フォルダに、resources.properties という名前の新しいファイルを作成します。
  2. resources.properties ファイルで、unqualifiedResLocale ラベルを使用してデフォルトのロケールを設定します。ロケール名を形成するには、言語コードをスクリプトや地域コード(省略可)と組み合わせ、それぞれをダッシュで区切ります。

    • 言語: 2 文字または 3 文字の ISO 639-1 コードを使用します。
    • スクリプト(省略可): ISO 15924 コードを使用します。
    • 地域(省略可): 2 文字の ISO 3166-1-alpha-2 コードまたは 3 桁の UN_M.49 コードを使用します。

    たとえば、デフォルトのロケールがアメリカ英語である場合は次のとおりです。

        unqualifiedResLocale=en-US
        

AGP は、このデフォルトのロケールと、res フォルダの values-* ディレクトリを使用して指定した代替ロケールを、自動生成された LocaleConfig ファイルに追加します。

アプリ別の言語の自動サポートはデフォルトでオフになっています。この機能を有効にするには、モジュール レベルの build.gradle.kts ファイル(Groovy を使用している場合は build.gradle ファイル)の androidResources {} ブロックで generateLocaleConfig 設定を使用します。

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint に JVM 17 をターゲットとするバイトコードが含まれている

AGP 8.1.0-alpha04 以降、Android Lint には JVM 17 をターゲットとするバイトコードが含まれています。カスタム lint チェックを記述する場合は、JDK 17 以降でコンパイルし、Kotlin コンパイラ オプションで jvmTarget = '17' を指定する必要があります。

lint ツールの詳細については、lint チェックでコードを改善するをご覧ください。

ネイティブ ライブラリの圧縮設定を DSL に移動

AGP 8.1.0-alpha10 以降では、マニフェストではなく DSL を使用してネイティブ ライブラリの圧縮を構成しないと、警告が表示されます。次のガイダンスでは、DSL を使用するように構成を更新する方法について説明します。これらの更新を行う際にサポートが必要な場合は、AGP Upgrade Assistant([Tools] > [AGP Upgrade Assistant])を使用してください。

圧縮されていないネイティブ ライブラリを使用するには、マニフェストから android::extractNativeLibs 属性を削除し、モジュール レベルの build.gradle.kts ファイル(Groovy を使用している場合は build.gradle ファイル)に次のコードを追加します。

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

試験運用版のビルドフラグ

これらは、AGP 8.1 で利用可能なビルドを構成するための試験運用版フラグです。

フラグ 追加日 デフォルト値 備考
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false 署名構成を指定せずにこれを有効にすると、プロファイリング可能またはデバッグ可能なビルドを実行するときに、AGP はデフォルトのデバッグ署名構成を使用します。このフラグはデフォルトで無効になっています。これは、ビルド作成者が特定のプロファイリング署名構成を宣言することを推奨するためです。
android.experimental.library.desugarAndroidTest AGP 8.0 false このフラグを使用すると、ライブラリビルダーは、linting などによって生成された AAR に影響を与えることなく、テスト APK のコア ライブラリの脱糖を有効にできます。最終的には、Variant API でこの動作をサポートする予定です。
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false 有効にすると、Gradle で管理されているデバイスでは、プラグインから提供できるユーザー定義のカスタム デバイスタイプを使用できます。Firebase Test Lab プラグインを使用する場合は、このフラグを有効にする必要があります。
android.lint.printStackTrace AGP 8.0 false 有効にすると、Android lint はクラッシュした場合にスタックトレースを出力します。このフラグには、LINT_PRINT_STACKTRACE 環境変数と同じ機能があります。
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 なし 任意の時点でアクティブにする Gradle マネージド デバイス(AVD)の同時実行数の上限を指定します。値が 0 または負の場合、デバイスの最大数はありません。
android.experimental.testOptions.installApkTimeout AGP 8.0 なし APK のインストールのタイムアウト時間(秒)。値が 0 または負の場合、UTP によってデフォルト値に設定されます。

修正された問題

Android Gradle プラグイン 8.1.0

修正された問題
Android Gradle プラグイン
構成キャッシュでの「com.android.build.gradle.tasks.ShaderCompile」の問題
AGP API を使用して Java リソースに追加すると構成キャッシュが破損する
[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so が APK 内にパッケージ化されている
設定中に KGP がマニフェストを読み取り、マニフェストの変更時に構成キャッシュを無効にする
マージ マニフェストに問題がある場合のビルド警告メッセージが不明確である
AGP 7.4 にアップグレードすると、StackOverflowError が発生する
Kotlin ライブラリのサブプロジェクトに直接依存する動的機能で ClassNotFoundException が発生する
テスト バリアントのマニフェスト プレースホルダで processDebugUnitTestManifest が失敗する
テスト バリアントのマニフェスト プレースホルダで processDebugUnitTestManifest が失敗する
名前空間プロパティが HasAndroidResources に属している可能性がある
「Gradle files have changed since last project sync」というメッセージを無効にできない
新しい Android Gradle プラグインがないのに「We recommend using a newer Android Gradle plugin」と表示される
テスト バリアントのマニフェスト プレースホルダで processDebugUnitTestManifest が失敗する
CheckAarMetadataTask でコンパイル SDK チェックを無効にするためのブール値フラグ
ビルドエラーが、存在しない API レベル 34 を指している
JVM ツールチェーンを設定しても JavaCompile targetCompatibility の値に影響しない
ワイルドカード ドメインを使用した Navigation の deepLink エントリのマージ マニフェストに「android:host」属性がない
Android Gradle プラグイン 8.1 以降で processDebugMainManifest タスクが失敗する
AnalyticsRecordingTask を削除したい
output-metadata.json の内容が一貫していない
AnalyticsRecordingTask を削除したい
output-metadata.json の内容が一貫していない
JVM ツールチェーンを設定しても JavaCompile targetCompatibility の値に影響しない
ワイルドカード ドメインを使用した Navigation の deepLink エントリのマージ マニフェストに「android:host」属性がない
Android Gradle プラグイン 8.1 以降で processDebugMainManifest タスクが失敗する
Android Studio で環境変数 STUDIO_GRADLE_JDK が優先して使用されない
カスタム ソースタイプでマルチフレーバーのソースセットを作成する必要がある
DependenciesInfoBuilder には API の更新とドキュメントが必要
ネストのメンバーがないことが原因で Java 11 ターゲットでの DexingNoClasspathTransform (minSdk >= 24) が失敗する
Groovy に記載されているとおりに DslExtension.Builder.extendProjectWith() が機能しない
kotlin.Pair を使用しない VariantSelector.withFlavor API を追加
「proguard.txt」が変更されたため、AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) にキャッシュミスがある
アプリのマージ マニフェストに依存関係の extractNativeLibs 属性と useEmbeddedDex 属性が含まれている
AGP: AIDL ツールとフレームワークの AIDL ファイルへのパスを公開 API として公開している
リクエスト: IDE が「PermittedSubclasses が ASM9 を要求する」問題の修正を提供できるようにする
バグ: 「KSP を有効にして、代わりにこの依存関係に KSP プロセッサを使用する」をオンにしてもウェブサイトに移動するだけである
.gradle/.android/analytics.settings が原因で Gradle 8.1 で構成キャッシュが壊れる
agp 8.1.0 の generateLocaleConfig は非決定的な順序を使用するため、再現可能なビルドができない
Dexer(D8)
最新のアップデート後にコアライブラリの脱糖でアプリがクラッシュする。
API 21 を使用する agp 8.1.0 回帰 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
lint
lint は、継承されたインターフェースではなく、直接実装されたインターフェースについてのみ、安全なキャストをチェックする
lint が呼び出しのレシーバについて有効なキャストをチェックしない
TypedArray#close(API 31)は脱糖されていないが、try-with-resources で使用したときに AS が警告を表示しない
バグ: 「「BC」プロバイダは非推奨になっており、Android P では...」という誤検出の警告
Kotlin を 1.8.0 にアップグレードした後の remember について、lint の誤検出が発生する
列挙型パラメータを使用してメソッド内で SDK_INT チェックを実行すると、誤検出の lint の警告が表示される
TypographyQuotes lint チェックがエスケープされた引用符で機能しない
TrustAllX509TrustManager lint チェックで、X509TrustManager を拡張するインターフェースに誤ってフラグが付けられる
修正の置換用に挿入されたコードのみを再フォーマットする
lint: インテンション プレビューが ReplaceStringQuickFix に対して例外をスローする
圧縮ツール(R8)
VerifyError: Kotlin 1.8.20 で R8 を使用した場合に検証ツールがクラスを拒否した
AGP 8 の R8 により Google Fit サービスが中断される
含めるソースファイルの情報に入力名と重複する名前が残っていると、正しく表現されない
ArrayIndexOutOfBoundsException を使用して Compose でビルド中に R8 が失敗する
シンプルな StringBuilder 関連のコードで、リリースモードまたは debuggable=false モードで tail 呼び出しを付加できない
VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds() メソッドの特殊なケース
java.lang.VerifyError の dex.startup-optimization の結果: クラスを拒否
Android 12 以降での確認エラーによるクラッシュ

Android Gradle プラグイン 8.1.1

修正された問題
Dexer(D8)
Java 16 レコード: equals(null) が NullPointerException をスローする
圧縮ツール(R8)
java.lang.VerifyError: 検証ツールがクラスを拒否
Apache POI ライブラリを使用している場合にビルドが :minifyReleaseWithR8 で先に進まなくなる
R8 最適化を有効にしたときに呼び出しを拒否する
java.lang.reflect.Executable の NoClassDefFoundError

Android Gradle プラグイン 8.1.2

修正された問題
Android Gradle プラグイン
Android ライブラリ モジュールで androidResources を利用できない
[AGP 8.1.0] splits.abi.isEnable と testOptions.unitTests.isIncludeAndroidResources の両方が true の場合、「Unable to find manifest output」というエラーで ./gradlew テストが失敗する
圧縮ツール(R8)
null チェックが削除された場合、Kotlin 1.9 で Kotlin ラムダが R8 によって破棄される
play-services-measurement-21.3.0-runtime.jar で「コンパイル中に未定義の値が検出されました」というエラーで R8 が失敗する

Android Gradle プラグイン 8.1.3

修正された問題
Android Gradle プラグイン
[AGP 8.1.0] splits.abi.isEnable と testOptions.unitTests.isIncludeAndroidResources の両方が true の場合、「Unable to find manifest output」というエラーで ./gradlew テストが失敗する
AGP 8.1 に更新した後にビルドが失敗する

Android Gradle プラグイン 8.1.4

修正された問題
Android Gradle プラグイン
アーティファクト変換によってすでに dex 変換されているサブプロジェクトのクラスに対して dex 変換タスクを実行しない