Android Gradle プラグイン 4.1.0(2020 年 8 月)

互換性

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

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

新機能

このバージョンの Android Gradle プラグインには、次の新機能が含まれています。

Kotlin Script DSL のサポート

Kotlin buildscript での編集を容易にするために、DSL と Android Gradle プラグイン 4.1 の API は、実装クラスとは別の一連の Kotlin インターフェースで定義されるようになりました。つまり、次のようになります。

  • null 可能性と可変性は、Kotlin 型で明示的に宣言されるようになりました。
  • これらのインターフェースから生成されたドキュメントは、Kotlin API リファレンスで公開されています。
  • Android Gradle プラグインでは API サーフェスが明確に定義されているため、Android の今後のビルド拡張の安定性が向上します。

重要: すでに KTS ビルド スクリプトを導入している場合や、buildSrc で Kotlin を使用している場合は、以前のリリースであればランタイム エラーになっていたようなエラーについて、ソースの互換性の問題が発生する可能性があります。

DSL で変化することが想定されているコレクション型は、一律に次のように定義されます。

val collection: MutableCollectionType

つまり、以前は Kotlin をサポートしていたコレクションでも、Kotlin スクリプトで次のように記述することができなくなりました。

collection = collectionTypeOf(...)

ただしコレクションの変更は一律にサポートされるため、collection += …collection.add(...) はどこでも使用できます。

Android Gradle プラグイン Kotlin API と DSL を使用するプロジェクトのアップグレードで問題が発生した場合は、バグを報告してください。

AAR から C / C++ の依存関係をエクスポートする

Android Gradle プラグイン 4.0 では、AAR 依存関係に Prefab パッケージをインポートする機能が追加されました。AGP 4.1 では、Android ライブラリ プロジェクト向けに AAR 内の外部ネイティブ ビルドからライブラリをエクスポートできるようになりました。

ネイティブ ライブラリをエクスポートするには、ライブラリ プロジェクトの build.gradle ファイルの android ブロックに次の行を追加します。

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

この例では、ndk-build または CMake 外部ネイティブ ビルドの mylibrary ライブラリと myotherlibrary ライブラリが、ビルドによって生成された AAR にパッケージ化され、それぞれが指定されたディレクトリから依存先にヘッダーをエクスポートします。

: Android Gradle プラグイン 4.0 以降を使用している場合、ビルド済みのネイティブ ライブラリのインポートに関する構成設定が変更されました。詳細については、4.0 リリースノートをご覧ください。

Kotlin メタデータの R8 サポート

Kotlin は Java クラスファイルのカスタム メタデータを使用して、Kotlin の言語構造を識別します。R8 では Kotlin メタデータの維持と書き換えが可能になったため、kotlin-reflect を使用する Kotlin ライブラリと Kotlin アプリケーションの圧縮が完全にサポートされます。

Kotlin メタデータを保持するには、次の keep ルールを追加します。

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

それにより、直接保持されるすべてのクラスについて、R8 が Kotlin メタデータを保持するように指示できます。

詳細については、Medium の R8 で Kotlin リフレクションを使用して Kotlin ライブラリとアプリケーションを圧縮する{:.external}をご覧ください。

デバッグビルドでのアサーション

Android Gradle プラグイン 4.1.0 以降を使用してアプリのデバッグ バージョンをビルドすると、組み込みコンパイラ(D8)がアプリのコードを書き換えてコンパイル時にアサーションを有効にするため、アサーション チェックは常に有効になります。

動作の変更

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

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

cleanBuildCache タスクと android.enableBuildCache プロパティおよび android.buildCacheDir プロパティは非推奨になり、AGP 7.0 で削除されます。現在、android.enableBuildCache プロパティは効果を生じさせませんが、android.buildCacheDir プロパティと cleanBuildCache タスクは、既存の AGP ビルド キャッシュのコンテンツを削除できるように、AGP 7.0 までは機能します。

コード圧縮を使用するアプリのサイズを大幅に削減

このリリース以降、R クラスのフィールドはデフォルトで保持されなくなりました。これによりコード圧縮に対応しているアプリでは、APK のサイズを大幅に削減できるようになります。リフレクションによって R クラスにアクセスする場合を除き、動作の変更は行われません。アクセスする場合は、これらの R クラスの keep ルールを追加する必要があります。

android.namespacedRClass プロパティの名前を android.nonTransitiveRClass に変更

試験運用版フラグ android.namespacedRClass の名前が android.nonTransitiveRClass に変更されました。

gradle.properties ファイル内でこのフラグを設定すると、各ライブラリの R クラスの名前空間が有効になります。その結果 R クラスにはライブラリ自体で宣言されたリソースのみが含まれ、ライブラリの依存関係からは除外されるようになります。これによりライブラリの R クラスのサイズが削減されます。

Kotlin DSL: coreLibraryDesugaringEnabled の名前を変更

Kotlin DSL コンパイル オプション coreLibraryDesugaringEnabledisCoreLibraryDesugaringEnabled に変更されました。このフラグの詳細については、Java 8 以降の API の脱糖サポート(Android Gradle プラグイン 4.0.0+)をご覧ください。

バージョン プロパティをライブラリ プロジェクトの BuildConfig クラスから削除

ライブラリ プロジェクトの場合のみ、生成される BuildConfig クラスから BuildConfig.VERSION_NAME および BuildConfig.VERSION_CODE プロパティが削除されます。これは、そうした静的な値がアプリケーションのバージョン コードと名前の最終的な値を反映しておらず、誤解を招いていたためです。またそれらの値は、マニフェストをマージする際に破棄されていました。

Android Gradle プラグインの今後のバージョンでは、ライブラリ用の DSL からも versionName および versionCode プロパティが削除されます。現時点では、ライブラリのサブプロジェクトから、アプリのバージョン コードとバージョン名に自動的にアクセスする方法はありません。

アプリケーション モジュールについては変更がないため、DSL で versionCodeversionName に値を割り当てることができます。その値はアプリのマニフェストや BuildConfig フィールドに反映されます。

NDK パスを設定する

モジュールの build.gradle ファイルの android.ndkPath プロパティを使用して、ローカルの NDK インストールのパスを設定できます。


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

このプロパティを android.ndkVersion プロパティと併用する場合、このパスには android.ndkVersion に一致する NDK バージョンが含まれている必要があります。

ライブラリ単体テストの動作変更

ライブラリの単体テストをコンパイルして実行する動作を変更しました。ライブラリの単体テストは、ライブラリ自体のコンパイル / ランタイム クラスに対してコンパイルし、実行するようになりました。そのため、単体テストは外部サブプロジェクトと同じ方法でライブラリを消費します。通常はこの構成により、テストの有効性が高まります。

場合によっては、ライブラリの単体テストでデータ バインディングを使用すると、DataBindingComponent クラスや BR クラスが欠落することがあります。その場合は、androidTest プロジェクト内のインストルメンテーション テストに移植する必要があります。そうしたクラスに対して単体テストをコンパイルして実行すると、正しい出力が得られない可能性があるためです。

io.fabric Gradle プラグインの非推奨

io.fabric Gradle プラグインは非推奨になっており、Android Gradle プラグインのバージョン 4.1 と互換性がありません。非推奨になった Fabric SDK と、Firebase Crashlytics SDK への移行の詳細については、Firebase Crashlytics SDK へのアップグレードをご覧ください。