Android Gradle プラグイン 7.0.0(2021 年 7 月)

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

7.0.1(2021 年 8 月)

このマイナー アップデートには、さまざまなバグの修正が含まれています。 主なバグ修正のリストについては、 <ph type="x-smartling-placeholder"></ph> リリース アップデート情報ブログをご覧ください。

互換性

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

AGP 7.0 の実行に JDK 11 が必要

Android Gradle プラグイン 7.0 を使用してアプリをビルドする場合、Gradle を実行するために JDK 11 が必要になりました。Android Studio Arctic Fox には JDK 11 がバンドルされており、Gradle がデフォルトでこれを使用するように設定されています。そのため、ほとんどの Android Studio ユーザーはプロジェクトの設定を変更する必要がありません。

ルールを手動で設定する必要がある場合は、 JDK バージョンが Android Studio 内の AGP によって使用されている場合は、JDK 11 を使用する必要があります。 以上です。

Android Studio とは別に AGP を使用する場合は、JAVA_HOME 環境変数または -Dorg.gradle.java.home コマンドライン オプションを JDK 11 のインストール ディレクトリに設定して、JDK バージョンをアップグレードします。

サポートが終了した SDK Tools パッケージに含まれる SDK Manager と AVD Manager は、 JDK 11 では動作しませんSDK Manager と AVD Manager を引き続き使用するには AGP 7.0 以降を使用する場合は、 現在の Android SDK コマンドライン ツール パッケージ

Variant API 安定版

新しい Variant API が安定版になりました。新しいインターフェースについては、 com.android.build.api.variant パッケージ、およびサンプルの gradle-recipes GitHub プロジェクト。新しい バリアント API を含むいくつかの中間ファイルを アーティファクトを アーティファクト 行うことができます。これらのアーティファクト(マージ マニフェストなど)は安全に取得できます。 サードパーティのプラグインやコードを使用してカスタマイズすることもできます。

今後も新機能を追加し、Variant API の拡張を進めていきます 利用できる中間アーティファクトの数も カスタマイズが可能です。

lint の動作の変更点

このセクションでは、Android Gradle での複数の lint の動作変更について説明します。 プラグイン 7.0.0.

ライブラリ依存関係の lint の改善

checkDependencies = true を使用した lint の実行が高速になりました 向上しますライブラリを含むアプリで構成される Android プロジェクトの場合 checkDependenciestrue を実行し、次のように lint を実行します。 ./gradlew :app:lint: すべての依存関係を分析します レポートが 1 つ生成され、各モジュールで検出された問題を含む 依存関係が存在します。

Groovy

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

lint タスクを UP-TO-DATE にできるようになりました

モジュールのソースとリソースが変更されていない場合、lint 分析は 再実行する必要はありません。この場合、タスクの実行は Gradle の出力に「UP-TO-DATE」と表示されます。この変更により、checkDependencies = true を使用してアプリ モジュールで lint を実行したときに、変更されたモジュールのみが 分析を実行できますそのため、lint の実行がさらに高速になります。

また、lint レポートタスクは、入力が出力されていない場合も実行する必要がありません。 変更されました。関連する既知の問題として、lint がない lint タスクが UP-TO-DATE のときに stdout に出力されるテキスト出力 (問題 #191897708)。

動的機能モジュールでの lint の実行

AGP は、動的機能モジュールからの lint の実行をサポートしなくなりました。 対応するアプリ モジュールから lint を実行すると、その動的機能モジュールで lint が実行され、すべての問題がアプリの lint レポートに含まれます。関連する既知の問題は、アプリ モジュールから checkDependencies = true で lint を実行したとき、アプリ依存関係でもある場合を除き、動的機能のライブラリ依存関係がチェックされないことです(問題 #191977888)。

デフォルトのバリアントのみの lint の実行

./gradlew :app:lint を実行すると、デフォルトのバリアントに対してのみ lint が実行されるようになりました。以前のバージョンの AGP では、すべてのバリアントに対して lint が実行されていました。

R8 圧縮ツールでのクラス欠落警告

R8 は、欠落しているクラスと -dontwarn オプションを、より正確に、かつ一貫して処理します。そのため、出力された欠落クラス警告の評価を開始する必要があります。 。

アプリまたはアプリで定義されていないクラス参照が R8 で検出された場合 依存関係がある場合は、ビルドに表示される警告が出力されます。 出力です。例:

R8: Missing class: java.lang.instrument.ClassFileTransformer

この警告は、アプリのコードを分析したときにクラス定義 java.lang.instrument.ClassFileTransformer が見つからなかったことを示しています。これは、通常はエラーがあることを意味しますが、この警告を無視したい場合もあります。この警告を無視する一般的な理由は 2 つあります。

  1. JVM をターゲットとし、欠落しているクラスが JVM のライブラリ ライブラリタイプを指定します(上記の例を参照)。

  2. いずれかの依存関係にコンパイル時のみの API が使用されている。

クラス欠落に関する警告を無視するには、-dontwarn proguard-rules.pro ファイルにルールを追加します。例:

-dontwarn java.lang.instrument.ClassFileTransformer

便宜上、AGP は欠落している可能性のあるルールをすべて含むファイルを生成し、app/build/outputs/mapping/release/missing_rules.txt のようなファイルパスに書き込みます。追加 proguard-rules.pro ファイルにルールを追加して警告を無視します。

AGP 7.0 では、クラス欠落メッセージは警告として表示されます。エラーとして表示されるようにするには、gradle.propertiesandroid.r8.failOnMissingClasses = true を設定します。この警告は、AGP 8.0 ではビルドを破壊するエラーになる予定です。-ignorewarnings オプションを proguard-rules.pro ファイルに追加することで AGP 7.0 の動作を維持することは可能ですが、おすすめはしません。

Android Gradle プラグインのビルド キャッシュを削除

AGP 4.1 では、AGP ビルド キャッシュが削除されました。AGP ビルド キャッシュは、Gradle ビルド キャッシュを補完するために以前 AGP 2.3 で導入されましたが、AGP 4.1 で Gradle ビルド キャッシュに完全に置き換えられました。今回の変更は 時間が短縮されます。

AGP 7.0 では、android.enableBuildCache プロパティで、 android.buildCacheDir プロパティ、 cleanBuildCache 個のタスクを削除しました。

プロジェクトで Java 11 のソースコードを使用する

アプリのプロジェクトで Java 11 までのソースコードをコンパイルできるようになりました。これにより、プライベート インターフェース メソッド、匿名クラスのダイヤモンド演算子、ラムダ パラメータのローカル変数構文などの新しい言語機能を使用できます。

この機能を有効にするには、compileOptions を目的の Java バージョンに設定し、compileSdkVersion を 30 以上に設定します。

// build.gradle
android {
  compileSdkVersion 30
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "11"
  }
}
// build.gradle.kts
android {
  compileSdkVersion(30)
  compileOptions {
    sourceCompatibility(JavaVersion.VERSION_11)
    targetCompatibility(JavaVersion.VERSION_11)
  }
  kotlinOptions {
    jvmTarget = "11"
  }
}

依存関係構成を削除

AGP 7.0 では、次の構成(または依存関係スコープ)が 削除:

  • compile
    ユースケースに応じて、api または implementation に置き換えられました。
    *Compile バリアントにも適用されます(debugCompile など)。
  • provided
    compileOnly に置き換えられました。
    *Provided バリアントにも適用されます。次に例を示します。 releaseProvided
  • apk
    runtimeOnly に置き換えられました。
  • publish
    runtimeOnly に置き換えられました。

ほとんどの場合、AGP Upgrade Assistant により、プロジェクトは自動的に新しい構成に移行されます。

Android に対してコンパイルする際のクラスパスの変更 Gradle プラグイン

Android Gradle プラグインに対してコンパイルする場合は、コンパイル クラスパスは変更される可能性があります。AGP は api/implementation を使用するようになったため 一部のアーティファクトがコンパイルから削除される場合があります。 クラスパスを指定します。コンパイル時に AGP の依存関係に依存している場合は、 明示的な依存関係として追加します。

Java リソース フォルダへのネイティブ ライブラリの追加はサポート対象外

これまでは、Java リソース フォルダにネイティブ ライブラリを追加し、android.sourceSets.main.resources.srcDirs を使用してそのフォルダを登録することで、ネイティブ ライブラリが抽出されて最終的な APK に追加されるようにしていました。AGP 7.0 以降、これはサポートされておらず、Java リソース フォルダのネイティブ ライブラリは無視されます。代わりに、サービス アカウント向けの DSL メソッドを ネイティブ ライブラリ、android.sourceSets.main.jniLibs.srcDirs。対象 詳細については、以下をご覧ください。 Google Workspace または ソースセットをご覧ください。

既知の問題

このセクションでは、Android Gradle プラグイン 7.0.0 に存在する既知の問題について説明します。

1.4.x Kotlin Multiplatform プラグインとの互換性がない

Android Gradle プラグイン 7.0.0 は以下と互換性があります。 Kotlin マルチプラットフォーム プラグイン 1.5.0 以降。Kotlin Multiplatform サポートを使用しているプロジェクトを Android Gradle プラグイン 7.0.0 で使用するには、Kotlin 1.5.0 に更新する必要があります。回避策として、Android Gradle プラグインをダウングレードできます。 4.2.x にアップグレードしますが、推奨されません。

詳細については、KT-43944 をご覧ください。

lint 出力がない

lint タスクが UP-TO-DATE の場合、lint テキストが stdout に出力されません(問題 #191897708)。詳しくは、lint の動作の変更点をご覧ください。この問題は Android Gradle プラグイン 7.1 で修正される予定です。

動的機能のライブラリ依存関係がすべて lint チェックされるわけではない

アプリ モジュールから checkDependencies = true で lint を実行したとき、アプリ依存関係でもある場合を除き、動的機能のライブラリ依存関係はチェックされません(問題 #191977888)。回避策として、これらのライブラリで lint タスクを実行できます。詳細については、lint の動作の変更点をご覧ください。