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

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

7.0.1(2021 年 8 月)

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

互換性

最小バージョン デフォルトのバージョン
Gradle 7.0.2 7.0.2
SDK Build Tools 30.0.2 30.0.2
NDK なし 21.4.7075529
JDK 11 11

AGP 7.0 の実行に JDK 11 が必要

Android Gradle プラグイン 7.0 を使用してアプリをビルドする場合、Gradle を実行するために JDK 11 が必要になりました。Android Studio Arctic Fox には JDK 11 がバンドルされており、デフォルトで 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 を実行することをおすすめします。これにより、すべての依存関係モジュールを並行して分析し、アプリと依存関係のすべての問題を含む単一のレポートを生成します。

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 は、アプリまたはその依存関係の 1 つで定義されていないクラス参照を検出すると、警告を発します。この警告はビルド出力に表示されます。次に例を示します。

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 ビルド キャッシュが削除されました。Gradle ビルド キャッシュを補完するために以前 AGP 2.3 で導入された AGP ビルド キャッシュは、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 マルチプラットフォーム サポートを使用するプロジェクトの場合、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 の動作の変更点をご覧ください。