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

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

7.0.1(2021 年 8 月)

このマイナー アップデートには、さまざまなバグの修正が含まれています。 主なバグ修正のリストについては、 リリース アップデート情報ブログの関連記事をご覧ください。

互換性

最小バージョン デフォルトのバージョン 備考
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 ユーザーはプロジェクトの設定を変更する必要がありません。

Android Studio 内で AGP が使用する JDK バージョンを手動で設定する必要がある場合は、JDK 11 以降を使用する必要があります。

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

非推奨になった SDK Tools パッケージに含まれる SDK Manager と AVD Manager は、JDK 11 では機能しません。AGP 7.0 以降で SDK Manager と AVD Manager を引き続き使用するには、現在の Android SDK コマンドライン ツール パッケージでツールの新しいバージョンに切り替える必要があります。

Variant API 安定版

新しい Variant API が安定版になりました。com.android.build.api.variant パッケージの新しいインターフェースと、gradle-recipes GitHub プロジェクトの例をご覧ください。新しい Variant API の一部として、Artifacts インターフェースを通じて、複数の中間ファイル(アーティファクト)を利用できるようになりました。これらのアーティファクトは、マージ マニフェストと同様に、サードパーティのプラグインとコードを使用して、安全に取得およびカスタマイズできます。

Google は今後も新機能を追加したり、カスタマイズに利用できる中間アーティファクトの数を増やしたりすることで、引き続き Variant API を拡張していきます。

lint の動作の変更点

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

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

checkDependencies = true での lint の実行が以前よりも高速になりました。ライブラリ依存関係を持つアプリで構成される Android プロジェクトの場合、次のように checkDependenciestrue に設定し、./gradlew :app:lint を介して 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 タスクが UP-TO-DATE の場合に lint テキストが stdout に出力されないことです(問題 #191897708)。

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

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

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

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

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

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

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 リソース フォルダのネイティブ ライブラリは無視されます。代わりに、ネイティブ ライブラリ android.sourceSets.main.jniLibs.srcDirs 向けの DSL メソッドを使用してください。詳細については、ソースセットを構成する方法をご覧ください。

既知の問題

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

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

Android Gradle プラグイン 7.0.0 は、Kotlin Multiplatform プラグイン 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 の動作の変更点をご覧ください。