この記事は Murat Yener による Android Developers Blog の記事 "AGP 7.0: Next major release for the Android Gradle plugin" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
2020 年 12 月 1 日(日本時間12 月 2 日 )、Android Studio 4.3 の初めての Canary 版がリリースされ、それとともに Android Gradle プラグイン(AGP)バージョン 7.0.0-alpha01 もリリースされました。Gradle プラグインのバージョン番号の付け方は、Android Studio のバージョン番号のスキームから切り離した上で改めて調整したので、番号を一気に 2 つも飛ばしています。このブログ投稿では、この変更の理由について説明するとともに、インキュベーション状態になっている新しい Android Gradle プラグインの API と DSLについて、いくつかの重要な変更点を簡単にご紹介します。
新しいバージョン番号のスキーム
AGP 7.0.0 では、セマンティック バージョニングの考え方を採用しています。つまり、API の互換性がない変更が発生するのは、メジャー バージョンが変更された場合のみです。メジャー バージョンは、Gradle で年に 1 回のメジャー リリースが行われるタイミングで、毎年 1 つずつ上げることを想定しています。
さらに、互換性のない変更が行われる場合は、1 年ほど前から削除される API に @Deprecated
を付け、それと同時期に削除される機能に代わる方法を提供することを保証します。これによりデベロッパーには約 1 年の猶予が与えられ、古い API が削除される前に新しい API を使ってプラグインのテストと移行を行えるようになります。
バージョン 5 と 6 を飛ばして直接 AGP 7.0.0 に変わったのは、Gradle のバージョンに合わせるという理由もあります。つまり、AGP 7.x は Gradle 7.x の API で動作するということです。Gradle 8.x でも動作するかもしれませんが、それは保証されていません。AGP が利用する API が 8.x で削除されていないかどうか次第です。
この変更に伴い、AGP のバージョン番号は Android Studio のバージョン番号とは切り離されます。ただし、当面の間、Android Studio と Android Gradle プラグインは同じタイミングでリリースする予定です。
Android Studio と Android Gradle プラグインとの互換性には、変更はありません。一般的なルールとして、AGP の安定版を使うプロジェクトはそれより新しいバージョンの Android Studio で開くことができます。
Java 11 要件
AGP 7.0.0-alpha01 では依然として Java プログラミング言語バージョン 8 を使用できますが、現在、最低限必要な Java プログラミング言語のバージョンを Java 11 に変更する作業を行っています。これは AGP 7.0.0-alpha02 から適用される予定です。この変更については、デベロッパーの皆さんが余裕を持って準備できるように、Canary 版のスケジュールという早い段階で、安定版リリースの何か月も前にお知らせしています。
インキュベーション状態の API と重要な API の変更点
今回の AGP のリリースでは、いくつかの API が変更されます。なお、AGP 4.1 で導入されたたくさんの API はインキュベーション状態としてマークされ、変更の可能性がありました。そして実際、AGP 4.2 で一部の API が変更されました。現在インキュベーション状態になっている API は、先ほど説明したサポート終了サイクルには従いません。
いくつかの重要な API の変更について、概要をまとめました。
- バージョン 4.2 ベータ版では、
onVariants
、onProperties
、onVariantProperties
ブロックが削除されます。 - これらの API は、新しい
androidComponents
ブロックのbeforeVariants
およびonVariants
で置き換えられます。beforeVariants
とonVariants
を利用すると、省略可能なVariantSelector
を使って、コールバックを実行するバリアントの数を減らすことができます。これは、ビルドタイプ、名前、フレーバーのいずれかに基づいて行うことができ、それぞれwithBuildType
、withName
、withFlavor
を使います。onVariants
およびbeforeVariants
が受け取るラムダは、AGP がafterEvaluate
でバリアントの組み合わせを計算した後に実行されます。onVariants
内のプロパティのネストは削除されます。 - 同様の API が androidComponentsにも追加され、バリアント内にテストをネストする代わりに、UnitTests 用(
beforeUnitTest
とunitTest
)と AndroidTests 用(beforeAndroidTest
とandroidTest
)に別々のブロックが許可されるようになります。 - 古い方法と新しい方法の両方でバリアントのアクションの登録に使われていた 2 つのクラスは、名前が変更されました。
Variant
はVariantBuilder
になり、beforeVariants
で使われます。VariantProperties
はVariant
になり、新しいonVariants
ブロックに渡されます。
いくつかの変更について確認してみましょう。以下のコードは、リリースビルドをターゲットとするサンプルの onVariants
ブロックです。onVariants
ブロックは beforeVariants
に変更され、次の例のバリアント セレクタを使用します。
```
android {
…
//onVariants.withName("release") {
// ...
//}
…
}
androidComponents {
val release = selector().withBuildType(“release”)
beforeVariants(release) { variant ->
...
}
}
```
同様に、onVariantProperties
ブロックも onVariants
に変更されます。
```
android {
...
//onVariantProperties {
// ...
\//}
…
}
androidComponents.onVariants { variant ->
...
}
```
なお、このカスタマイズは通常はプラグインで行うもので、build.gradle に配置すべき内容ではありません。レシーバのある関数の使用は避けています。これは DSL 構文には適していますが、プラグインのコードには必要ありません。
これらの API は、AGP 7.0.0 で安定版になる予定です。また、すべてのプラグイン作成者は、新しい androidComponents に移行する必要があります。このような変更に対処するのを避けたい方は、プラグインで安定版の API のみ使用し、インキュベーション状態の API は使わないでください。
今回のリリースに含まれるその他の変更点の詳細については、リリースノートをご覧ください。
Java は Oracle および/またはその関連会社の登録商標です。
Reviewed by Takeshi Hagikura - Developer Relations Team and Hidenori Fujii - Google Play Developer Marketing APAC