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 プロジェクトの場合は、以下のように checkDependencies を
true に設定し、
./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」と表示されます。この変更により、アプリ モジュールで lint を実行する場合、checkDependencies = true を設定すると、分析を実行する必要があるのは変更されたモジュールのみになります。そのため、lint の実行がさらに高速になります。
lint レポートタスクも、入力が変更されていなければ 実行する必要はありません。関連する既知の問題 は、lint タスクが UP-TO-DATE の場合に lint テキストが stdout に出力されないことです (問題 #191897708)。
動的機能モジュールでの lint の実行
AGP は、動的機能モジュールからの lint の実行をサポートしなくなりました。
対応するアプリ モジュールから lint を実行すると、
その動的機能モジュールで lint が実行され、すべての問題がアプリの lint
レポートで報告されます。関連する既知の問題 は、アプリ モジュールから lint
を checkDependencies = true 設定して実行したとき、動的機能のライブラリ依存関係が(アプリ依存関係でもある場合を除いて)チェックされないことです(問題
#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 つがあります。
-
JVM と欠落しているクラスをターゲットとするライブラリが(上記の例と同様に)JVM ライブラリ タイプである。
-
いずれかの依存関係にコンパイル時のみの 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 では、クラス欠落メッセージは警告として表示されます。エラーとして表示されるようにするには、
android.r8.failOnMissingClasses = true を
gradle.properties で設定します。この警告は、AGP 8.0 では
ビルドを破壊するエラーになる予定です。`-ignorewarnings` オプションを `proguard-rules.pro` ファイルに追加することで AGP 7.0 の動作を維持することは可能ですが、おすすめはしません。-ignorewarnings
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 を使用してください。詳細については、ソースセットを構成する方法をご覧ください。
既知の問題
このセクションでは、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 の動作の変更点をご覧ください。