Android Studio ビルドシステムは Gradle をベースにしており、Android Gradle プラグインは Android アプリのビルドに固有の機能を追加します。Android プラグインは通常、Android Studio によりロックステップでアップデートされますが、プラグイン(および他の Gradle システム)は Android Studio から独立して動作でき、個別にアップデートできます。
このページでは、Gradle ツールを最新の状態に保つ方法と、最近のアップデート内容について説明します。
Gradle で Android ビルドを構成する方法の詳細については、下記のページをご覧ください。
Gradle ビルドシステムの詳細については、Gradle のユーザーガイドをご覧ください。
Android Gradle プラグインのアップデート
Android Studio をアップデートすると、Android Gradle プラグインを利用可能な最新バージョンに自動的にアップデートするように促すメッセージが表示されることがあります。アップデートに同意するか、プロジェクトのビルド要件に基づいて手動でバージョンを指定するかを選択できます。
プラグインのバージョンは、Android Studio の [File] > [Project Structure] > [Project] メニュー、または最上位の build.gradle
ファイルで指定できます。プラグインのバージョンは、その Android Studio プロジェクトでビルドされたすべてのモジュールに適用されます。次の例では、build.gradle
ファイルからプラグインをバージョン 3.4.2 に設定しています。
buildscript { repositories { // Gradle 4.1 and higher include support for Google's Maven repo using // the google() method. And you need to include this repo to download // Android Gradle plugin 3.0.0 or higher. google() ... } dependencies { classpath 'com.android.tools.build:gradle:3.4.2' } }
注意: バージョン番号には、'com.android.tools.build:gradle:2.+'
などの動的な依存関係を使用しないでください。この機能を使用すると、予期しないバージョンのアップデートが起こり、バージョンの相違を解決するのが難しくなる可能性があります。
指定したプラグイン バージョンがダウンロードされていない場合、次回プロジェクトをビルドするときに Gradle がダウンロードします。または、Android Studio のメニューバーから [Tools] > [Android] > [Sync Project with Gradle Files] をクリックします。
Gradle のアップデート
Android Studio をアップデートすると、Gradle を利用可能な最新バージョンにアップデートするように促すメッセージも表示されることがあります。アップデートに同意するか、プロジェクトのビルド要件に基づいて手動でバージョンを指定するかを選択できます。
次の表に、Android Gradle プラグインの各バージョンに必要な Gradle のバージョンを示します。最高のパフォーマンスを得るには、Gradle とプラグインの両方について、最新バージョンを使用する必要があります。
プラグインのバージョン | 必要な Gradle のバージョン |
---|---|
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
1.5.0 | 2.2.1 - 2.13 |
2.0.0 - 2.1.2 | 2.10 - 2.13 |
2.1.3 - 2.2.3 | 2.14.1 以降 |
2.3.0 以降 | 3.3 以降 |
3.0.0 以降 | 4.1 以降 |
3.1.0 以降 | 4.4 以降 |
3.2.0 - 3.2.1 | 4.6 以降 |
3.3.0 - 3.3.2 | 4.10.1 以降 |
3.4.0 以降 | 5.1.1 以降 |
Gradle のバージョンは、Android Studio の [File] > [Project Structure] > [Project] メニューで、または gradle/wrapper/gradle-wrapper.properties
ファイルの Gradle 配布リファレンスを編集することで、指定できます。次の例では、gradle-wrapper.properties
ファイルで Gradle のバージョンを 5.1.1 に設定しています。
... distributionUrl = https\://services.gradle.org/distributions/gradle-5.1.1-all.zip ...
3.4.0(2019 年 4 月)
このバージョンの Android プラグインには、次のものが必要です。
Gradle 5.1.1 以降。詳細については、Gradle のアップデートに関するセクションをご覧ください。
3.4.2(2019 年 7 月)
Android Studio 3.4.2 をサポートするマイナー アップデートです。さまざまなバグの修正とパフォーマンスの改善が含まれています。主なバグ修正のリストについては、リリース アップデート情報ブログの関連記事をご覧ください。
3.4.1(2019 年 5 月)
Android Studio 3.4.1 をサポートするマイナー アップデートです。さまざまなバグの修正とパフォーマンスの改善が含まれています。主なバグ修正のリストについては、リリース アップデート情報ブログの関連記事をご覧ください。
新機能
新しい lint チェック依存関係コンフィグレーション:
lintChecks
の動作が変更され、新しい依存関係コンフィグレーションlintPublish
が導入されました。これにより、Android ライブラリにパッケージ化される lint チェックを細かく制御できるようになりました。lintChecks
: プロジェクトをローカルでビルドするときにのみ実行する lint チェックに使用する、既存のコンフィグレーション。以前にlintChecks
依存関係コンフィグレーションを使用して公開 AAR に lint チェックを含めていた場合は、これらの依存関係を移行して、下記の新しいlintPublish
コンフィグレーションを使用する必要があります。lintPublish
: 下記のように、公開 AAR に含める lint チェックに使用する、ライブラリ プロジェクトの新しいコンフィグレーション。つまりライブラリを使用するプロジェクトでも、これらの lint チェックを適用します。
次のコードサンプルでは、ローカルの Android ライブラリ プロジェクトで両方の依存関係コンフィグレーションを使用しています。
dependencies { // Executes lint checks from the ':lint' project at build time. lintChecks project(':lint') // Packages lint checks from the ':lintpublish' in the published AAR. lintPublish project(':lintpublish') }
一般に、パッケージングと署名のタスクで、全体的なビルド速度が改善されています。これらのタスクに関連してパフォーマンスの低下が見られた場合は、バグを報告してください。
動作の変更
Android Instant Apps Feature プラグイン非推奨の警告: インスタント アプリのビルドに依然として
com.android.feature
プラグインを使用している場合、Android Gradle プラグイン 3.4.0 では、非推奨の警告がスローされます。今後のバージョンのプラグインでもインスタント アプリをビルドできるようにするには、動的機能プラグインを使用するようにインスタント アプリを移行します。またこれにより、インストール済みアプリとインスタント アプリの両方のエクスペリエンスを、単一の Android App Bundle から公開できます。R8 をデフォルトで有効化: R8 は、desugar、圧縮、難読化、最適化、dex 変換をすべて 1 つのステップに統合し、ビルド パフォーマンスを大幅に改善します。Android Gradle プラグイン 3.3.0 で導入された R8 は、Android Gradle プラグイン 3.4.0 以降では、アプリ プロジェクトと Android ライブラリ プロジェクトの両方に対してデフォルトで有効になっています。
R8 が導入される前のコンパイル プロセスの概要を下記の図に示します。
現在では下記の図のように、R8 により、desugar、圧縮、難読化、最適化、dex 変換(D8)がすべて 1 つのステップで完了します。
R8 は既存の ProGuard ルールと連携するように設計されているため、通常は、R8 を活用するうえで必要となる措置はありません。ただし、Android プロジェクト専用に設計された ProGuard とは異なるテクノロジーであるため、圧縮や最適化により、ProGuard では発生しないコードの削除が生じる可能性があります。そのため、ごくまれにこのような状況が生じた場合は、ビルド出力内にそのコードを保持するための追加ルールが必要となることがあります。
R8 を使用して問題が発生した場合は、R8 の互換性に関してよくある質問をご覧になり、当該問題の解決策がないかご確認ください。解決策が記載されていない場合は、バグを報告してください。R8 を無効にするには、次の行のいずれかをプロジェクトの
gradle.properties
ファイルに追加します。# Disables R8 for Android Library modules only. android.enableR8.libraries = false # Disables R8 for all modules. android.enableR8 = false
ndkCompile
は非推奨:ndkBuild
を使用してネイティブ ライブラリをコンパイルしようとすると、ビルドエラーが発生するようになりました。代わりに CMake か ndk-build を使用して、プロジェクトに C / C++ コードを追加する必要があります。
既知の問題
一意のパッケージ名を正しく使用することは現在必須ではありませんが、プラグインの今後のバージョンでは、より厳密になります。Android Gradle プラグインのバージョン 3.4.0 では、次の行を
gradle.properties
ファイルに追加することで、使用可能なパッケージ名をプロジェクトで宣言しているかどうかの確認をオプトインできます。android.uniquePackageNames = true
Android Gradle プラグインを使用してパッケージ名を設定する方法について詳しくは、アプリケーション ID の設定をご覧ください。
3.3.0(2019 年 1 月)
このバージョンの Android プラグインには、次のものが必要です。
Gradle 4.10.1 以降。詳細については、Gradle のアップデートに関するセクションをご覧ください。
3.3.2(2019 年 3 月)
Android Studio 3.3.2 をサポートするマイナー アップデートです。さまざまなバグの修正とパフォーマンスの改善が含まれています。主なバグ修正のリストについては、リリース アップデート情報ブログの関連記事をご覧ください。
3.3.1(2019 年 2 月)
Android Studio 3.3.1 をサポートするマイナー アップデートです。さまざまなバグの修正とパフォーマンスの改善が含まれています。
新機能
クラスパス同期の改善: ランタイム クラスパスやコンパイル クラスパスの依存関係を解決する際、Android Gradle プラグインは、複数のクラスパスにまたがって現れる依存関係に関し、それ以降の特定のバージョン競合を修正しようとします。
たとえば、ランタイム クラスパスにライブラリ A バージョン 2.0 が含まれ、コンパイル クラスパスにライブラリ A バージョン 1.0 が含まれている場合、プラグインはコンパイル クラスパスの依存関係を自動的にライブラリ A バージョン 2.0 にアップデートして、エラーを回避します。
ただし、ランタイム クラスパスにライブラリ A バージョン 1.0 が含まれ、コンパイル クラスパスにライブラリ A バージョン 2.0 が含まれている場合、プラグインはコンパイル クラスパスの依存関係をライブラリ A バージョン 1.0 にダウングレードしないため、エラーが発生します。詳細については、クラスパス間の競合の修正をご覧ください。
アノテーション プロセッサ使用時の増分 Java コンパイルの改善: このアップデートにより、アノテーション プロセッサ使用時の増分 Java コンパイルのサポートが改善され、ビルド時間が短縮されます。
- Kapt を使用するプロジェクト(ほとんどの Kotlin のみのプロジェクトと Kotlin-Java ハイブリッド プロジェクト): データ バインディングや retro-lambda プラグインを使用する場合でも、増分 Java コンパイルが有効になります。Kapt タスクによるアノテーション処理は、まだ増分ではありません。
Kapt を使用しないプロジェクト(Java のみのプロジェクト): 使用するすべてのアノテーション プロセッサが増分アノテーション処理をサポートしている場合、増分 Java コンパイルはデフォルトで有効になります。増分アノテーション プロセッサの採用状況を確認するには、Gradle の問題 5277 をご覧ください。
ただし、1 つ以上のアノテーション プロセッサが増分ビルドをサポートしていない場合、増分 Java コンパイルは有効になりません。代わりに、
gradle.properties
ファイルで次のフラグを指定できます。android.enableSeparateAnnotationProcessing=true
このフラグを指定すると、Android Gradle プラグインは別のタスクでアノテーション プロセッサを実行し、Java コンパイル タスクを段階的に実行できます。
古い API を使用する場合のデバッグ情報の改善: プラグインは、サポートされなくなった API の使用を検出したとき、その API が使用されている場所の特定に役立つ、より詳細な情報を提供できるようになりました。追加情報を表示するには、プロジェクトの
gradle.properties
ファイルで次のように指定する必要があります。android.debug.obsoleteApi=true
コマンドラインから
-Pandroid.debug.obsoleteApi=true
を渡すことでフラグを有効にすることもできます。コマンドラインから、動的機能モジュールでのインストゥルメンテーション テストを実行できます。
動作の変更
遅延タスク設定: プラグインは Gradle の新しいタスク作成 API を使用して、現在のビルド(または実行タスクグラフにないタスク)の完了に必要でないタスクの初期化と設定を回避するようになりました。たとえば、「release」や「debug」など複数のビルド バリアントがあり、アプリの「debug」バージョンをビルドしている場合、プラグインはアプリの「release」バージョンのタスクの初期化と設定を回避します。
variant.getJavaCompile()
など、Variants API の特定の古いメソッドを呼び出すと、タスクの設定が必須になることがあります。ビルドを遅延タスク設定用に最適化するには、代わりにvariant.getJavaCompileProvider()
などのTaskProvider
オブジェクトを返す新しいメソッドを呼び出します。カスタムビルド タスクを実行する場合は、Gradle の新しいタスク作成 API に対応する方法をご確認ください。
特定のビルドタイプで
useProguard false
を設定すると、プラグインは ProGuard の代わりに R8 を使用して、アプリのコードとリソースを圧縮し難読化するようになりました。R8 の詳細については、Android デベロッパー ブログのこちらのブログ投稿をご覧ください。ライブラリ プロジェクトの R クラス生成の高速化: 以前、Android Gradle プラグインは、プロジェクトの依存関係ごとに
R.java
ファイルを生成し、アプリの他のクラスと一緒にコンパイルしていました。プラグインは最初に中間のR.java
クラスをビルドせずに、アプリのコンパイル済み R クラスを含む JAR を直接生成するようになりました。この最適化によって、ライブラリ サブプロジェクトや依存関係が多数あるプロジェクトのビルド パフォーマンスが大幅に改善され、Android Studio のインデックス処理速度が改善される可能性があります。Android App Bundle をビルドする際、Android 6.0(API レベル 23)以降を対象とするアプリバンドルから生成された APK には、デフォルトで未圧縮バージョンのネイティブ ライブラリが含まれるようになりました。この最適化によって、デバイスがライブラリのコピーを作成する必要がなくなるため、アプリのディスク上のサイズが小さくなります。この最適化を無効にする場合は、
gradle.properties
ファイルに次の行を追加します。android.bundle.enableUncompressedNativeLibs = false
一部のサードパーティ プラグインの最小バージョンを適用します。
シングル バリアント プロジェクト同期: ビルド設定とプロジェクトを同期することは、プロジェクトの構造を Android Studio に認識させる重要なステップです。ただし、大規模なプロジェクトでは、この処理に時間がかかることがあります。プロジェクト内で複数のビルド バリアントを使用している場合は、現在選択しているバリアントだけをプロジェクトと同期することで、この処理を最適化できます。
この最適化を有効にするには、Android Studio 3.3 以降と、Android Gradle Plugin 3.3.0 以降を使用する必要があります。要件を満たすと、プロジェクトの同期時に、この最適化を有効にするか尋ねるプロンプトが表示されます。この最適化は、新しいプロジェクトでもデフォルトで有効になっています。
手動でこの最適化を有効にするには、[File] > [Settings] > [Experimental] > [Gradle](Mac の場合は [Android Studio] > [Preferences] > [Experimental] > [Gradle])をクリックして、[Only sync the active variant] チェックボックスをオンにします。
注: この最適化機能は、Java 言語や C++ 言語を使用したプロジェクトを完全にサポートしており、Kotlin にも一部対応しています。Kotlin コンテンツを含むプロジェクトでこの最適化を有効にすると、内部で完全なバリアントを使用するように、Gradle 同期がフォールバックします。
不足している SDK パッケージの自動ダウンロード: この機能は、NDK をサポートするように拡張されました。詳細については、不足しているパッケージの Gradle での自動ダウンロードをご覧ください。
バグの修正
Android Gradle プラグイン 3.3.0 で修正される問題は、次のとおりです。
- Jetifier が有効になっているにもかかわらず AndroidX バージョンではなく
android.support.v8.renderscript.RenderScript
を呼び出すビルドプロセス - 次を含む
androidx-rs.jar
によるクラッシュ: 静的にバンドルされたannotation.AnyRes
- RenderScript を使用する場合、
build.gradle
ファイルで Build Tools のバージョンを手動設定する必要がなくなりました。
- Jetifier が有効になっているにもかかわらず AndroidX バージョンではなく
3.2.0(2018 年 9 月)
このバージョンの Android プラグインには、次のものが必要です。
- Gradle 4.6 以降。詳細については、Gradle のアップデートに関するセクションをご覧ください。
- SDK Build Tools 28.0.3 以降。
3.2.1(2018 年 10 月)
このアップデートにより、SDK Build Tools のバージョンを指定する必要がなくなりました。Android Gradle プラグインはデフォルトでバージョン 28.0.3 を使用します。
新機能
Android App Bundle のビルドのサポート: アプリバンドルは新しいアップロード形式で、アプリのコンパイル済みコードとリソースはすべてここに含まれますが、APK の生成と署名は Google Play ストアで行います。デベロッパー側では複数の APK を生成、署名、管理する必要がなくなり、ユーザー側ではサイズが削減されデバイスに合わせて最適化されたダウンロードを行えます。詳細については、Android App Bundle の概要をご覧ください。
アノテーション プロセッサ使用時の増分ビルド速度改善のサポート:
AnnotationProcessorOptions
DSL でCommandLineArgumentProvider
を拡張しました。これによりユーザーやアノテーション プロセッサ作成者は、増分ビルド プロパティ型のアノテーションを使用してプロセッサの引数にアノテーションを付けられます。このようなアノテーションを使用すると、増分ビルドやキャッシュ済みクリーンビルドの正確性とパフォーマンスが改善されます。詳細については、アノテーション プロセッサへの引数の指定をご覧ください。AndroidX 用移行ツール: Android 3.2 以降で Android Gradle プラグイン 3.2.0 を使用している場合、メニューバーから [Refactor] > [Migrate to AndroidX] を選択することで、プロジェクトのローカル依存関係と Maven 依存関係を移行して新しい AndroidX ライブラリを使用できます。この移行ツールを使用すると、
gradle.properties
ファイルで次のフラグもtrue
に設定されます。android.useAndroidX
:true
に設定すると、Android プラグインは Support Library ではなく、該当する AndroidX ライブラリを使用します。このフラグが指定されていない場合、プラグインはデフォルトでfalse
に設定します。android.enableJetifier
:true
に設定すると、Android プラグインは既存のサードパーティ ライブラリのバイナリを書き換えて、AndroidX を使用するように自動的に移行します。このフラグが指定されていない場合、プラグインはデフォルトでfalse
に設定します。このフラグをtrue
に設定できるのはandroid.useAndroidX
もtrue
に設定されている場合のみであり、それ以外の場合はビルドエラーが発生します。
詳細については、AndroidX の概要をご覧ください。
新しいコード圧縮ツール R8: R8 はコードの圧縮と難読化用の新しいツールで、ProGuard の後継です。R8 のプレビュー版を使い始めるには、プロジェクトの
gradle.properties
ファイルに次の行を追加します。android.enableR8 = true
動作の変更
- D8 での desugar がデフォルトで有効になりました。
AAPT2 は Google の Maven リポジトリに移動しました。AAPT2 を使用するには、下記のように、
build.gradle
ファイル内でgoogle()
依存関係を指定する必要があります。buildscript { repositories { google() // here jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.0' } } allprojects { repositories { google() // and here jcenter() }
ネイティブの multidex がデフォルトで有効になりました。以前のバージョンの Android Studio では、Android API レベル 21 以上が搭載されているデバイスにアプリのデバッグ バージョンをデプロイすると、ネイティブ multidex が有効になりました。今回のリリースでは、デバイスへのデプロイであるかリリース用 APK の作成であるかにかかわらず、
minSdkVersion=21
以上に設定されているすべてのモジュールに対して、Android Plugin for Gradle がネイティブ multidex を有効にします。プラグインの最小バージョンが protobuf プラグイン(0.8.6)、Kotlin プラグイン(1.2.50)、Crashlytics プラグイン(1.25.4)になりました。
機能モジュール プラグイン
com.android.feature
では、モジュール名の指定時に英数字とアンダースコアのみを使用するようになりました。たとえば機能モジュール名にダッシュが含まれていると、ビルドエラーが発生します。この動作は、動的機能モジュール プラグインの動作と同じです。
バグの修正
- JavaCompile は、データ バインディングのあるプロジェクトでキャッシュできるようになりました(問題 #69243050)。
- データ バインディングのあるライブラリ モジュールのコンパイル回避を改善しました(問題 #77539932)。
- オンデマンド設定を、以前のバージョンでは予測不能なビルドエラーのために無効にしていた場合でも、再度有効にできるようになりました(問題 #77910727)。
3.1.0(2018 年 3 月)
このバージョンの Android プラグインには、次のものが必要です。
- Gradle 4.4 以降。詳細については、Gradle のアップデートに関するセクションをご覧ください。
- Build Tools 27.0.3 以降。
android.buildToolsVersion
プロパティを使用してビルドツールのバージョンを指定する必要がなくなりました。プラグインはデフォルトで必要な最低限のバージョンを使用します。
新しい DEX コンパイラ D8
Android Studio は、D8 という新しい DEX コンパイラをデフォルトで使用するようになりました。DEX コンパイルは、.class
バイトコードを Android ランタイム(古いバージョンの Android では Dalvik)用の .dex
バイトコードに変換する処理です。DX という以前のコンパイラと比較すると、D8 はコンパイルが高速で、出力される DEX ファイルのサイズが小さく、しかもアプリのランタイム パフォーマンスは同等以上です。
D8 によって日々のアプリ開発ワークフローが変わることはありませんが、新しいコンパイラに関連する問題が発生した場合は、バグを報告してください。プロジェクトの gradle.properties
ファイルで次のように指定すると、D8 を一時的に無効にして DX を使用できます。
android.enableD8=false
Java 8 言語機能を使用しているプロジェクトの場合、デフォルトで増分 desugar が有効になってます。無効にするには、プロジェクトの gradle.properties
ファイルで次のように指定します。
android.enableIncrementalDesugaring=false.
プレビュー ユーザー: すでに D8 のプレビュー版を使用している場合、JDK ではなく、SDK ビルドツールに含まれるライブラリに対してコンパイルされるようになりました。そのため、JDK には存在するが SDK ビルドツール ライブラリには存在しない API にアクセスすると、コンパイル エラーが発生します。
動作の変更
それぞれ異なる ABI をターゲットとする複数の APK を作成する場合、プラグインで、
mips
、mips64
、armeabi
の ABI 用の APK がデフォルトで生成されなくなりました。これらの ABI をターゲットとする APK を作成するには、NDK r16b 以下を使用し、下記のように
build.gradle
ファイルで該当する ABI を指定する必要があります。splits { abi { include 'armeabi', 'mips', 'mips64' ... } }
Android Instant App 用に設定 APK を作成するとき、デフォルトで言語設定の分割がルートの言語によってグループ化されるようになりました。たとえば、アプリに
zh-TW
ロケールやzh-CN
ロケールのリソースが含まれている場合、Gradle はそれらのリソースをzh
言語設定分割にパッケージ化します。この動作は、次のようにinclude
プロパティを使用して独自のグループを定義することで、オーバーライドできます。splits { language { enable true // Each string defines a group of locales that // Gradle should package together. include "in,id", "iw,he", "fil,tl,tgl", "yue,zh,zh-TW,zh-CN" } }
Android プラグインのビルド キャッシュが、30 日以上経過したキャッシュ エントリを削除するようになりました。
resConfig
に"auto"
を渡しても、APK にパッケージ化する文字列リソースが自動的に選択されなくなりました。引き続き"auto"
を使用する場合、プラグインはアプリと依存関係で提供されるすべての文字列リソースをパッケージ化します。そのため、プラグインを APK にパッケージ化する各ロケールを指定する必要があります。ローカル モジュールはアプリのテスト APK に依存できないため、
androidTestApi
の代わりにandroidTestImplementation
コンフィグレーションを使用してインストゥルメント化テストに依存関係を追加すると、Gradle は次の警告を発行します。WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with 'androidTestImplementation'
修正
- Android Studio がコンポジット ビルドの依存関係を正しく認識しない問題を修正しました。
- 1 回のビルドで Android プラグインを複数回読み込むと(たとえば buildscript のクラスパスに Android プラグインが含まれているサブプロジェクトが複数存在する場合)、プロジェクト同期エラーが発生する問題を修正しました。
3.0.0(2017 年 10 月)
Android Gradle プラグイン 3.0.0 には、大規模プロジェクトのパフォーマンスの問題に対処することを目的とした、さまざまな変更が含まれています。
たとえば、約 130 個のモジュールと多数の外部依存関係を持つ(ただしコードやリソースはない)サンプル スケルトン プロジェクトでは、次のようなパフォーマンス改善が得られます。
Android プラグイン バージョン + Gradle バージョン | Android プラグイン 2.2.0 + Gradle 2.14.1 | Android プラグイン 2.3.0 + Gradle 3.3 | Android プラグイン 3.0.0 + Gradle 4.1 |
---|---|---|---|
構成(例: ./gradlew --help の実行) |
~2 分 | ~9 秒 | ~2.5 秒 |
Java を 1 行変更(実装変更) | ~2 分 15 秒 | ~29 秒 | ~6.4 秒 |
これらの変更の中には、既存のビルドが失敗するものもあります。そのため、新しいプラグインを使用する前に、プロジェクトを移行する労力を考慮する必要があります。
上記のパフォーマンス改善が見られない場合は、Gradle Profiler を使用したビルドのトレースを含めてバグを報告してください。
このバージョンの Android プラグインには、次のものが必要です。
- Gradle 4.1 以降。詳細については、Gradle のアップデートに関するセクションをご覧ください。
- Build Tools 26.0.2 以降。このアップデートにより、ビルドツールのバージョンを指定する必要がなくなりました。プラグインはデフォルトで必要な最低限のバージョンを使用します。そのため、
android.buildToolsVersion
プロパティを削除できるようになりました。
3.0.1(2017 年 11 月)
Android Studio 3.0.1 をサポートするマイナー アップデートです。全般的なバグの修正とパフォーマンスの改善が含まれています。
最適化
- 詳細なタスクグラフによるマルチモジュール プロジェクトの並列処理の改善。
- 依存関係を変更する際に、その依存関係の API にアクセスしないモジュールを再コンパイルしなくなるため、Gradle ビルドが高速になりました。Gradle の新しい依存関係コンフィグレーションを使用して(
implementation
、api
、compileOnly
、runtimeOnly
)、API が他のモジュールにリークする依存関係を制限する必要があります。 - クラスごとに dex を実行することにより、増分ビルドが高速になりました。各クラスが個別の DEX ファイルにコンパイルされ、変更されたクラスのみが re-dex されるようになりました。また、
minSdkVersion
を 20 以下に設定した、以前の multi-dex を使用しているアプリでも、ビルド速度の向上が見込まれます。 - 特定のタスクを最適化してキャッシュ出力を使用することで、ビルド速度を改善しました。この最適化を活かすには、まず Gradle ビルド キャッシュを有効にする必要があります。
- デフォルトで有効になった AAPT2 を使用する増分リソース処理を改善しました。AAPT2 の使用中に問題が発生した場合は、バグを報告してください。
gradle.properties
ファイルでandroid.enableAapt2=false
を設定し、コマンドラインから./gradlew --stop
を実行して Gradle デーモンを再起動することにより、AAPT2 を無効にすることもできます。
新機能
- バリアント識別による依存関係の管理。プラグインは、モジュールの特定のバリアントをビルドする際に、ローカル ライブラリ モジュールの依存関係と、ビルドしているモジュールのバリアントを自動的にマッチングするようになりました。
- Android Instant Apps と Android Instant Apps SDK(SDK Manager を使用してダウンロードできます)をサポートする、新しい機能モジュール プラグインが含まれています。新しいプラグインによる機能モジュールの作成の詳細については、複数の機能を備えたインタント アプリの構造をご覧ください。
- 特定の Java 8 言語機能と Java 8 ライブラリを使用するためのビルトイン サポート。 Jack は非推奨になり、不要になりました。このため、まず Jack を無効にしてから、デフォルトのツールチェーンにビルトインされている改善された Java 8 サポートを使用する必要があります。詳細については、Java 8 言語機能の使用をご覧ください。
- Android Test Orchestrator でテストを行うサポートを追加しました。これにより、アプリのテストをそれぞれの
Instrumentation
呼び出し内で行えます。各テストはそれぞれのInstrumentation
インスタンスで行われるため、テスト間の共有状態はデバイスの CPU やメモリに蓄積されません。また、1 つのテストがクラッシュした場合でも、そのInstrumentation
インスタンスのみが削除されるため、他のテストは引き続き行われます。- デバイス上のテスト オーケストレーションを使用するかどうかを決定する
testOptions.execution
を追加しました。Android Test Orchestrator を使用する場合、次に示すようにANDROID_TEST_ORCHESTRATOR
を指定する必要があります。デフォルトでは、このプロパティはHOST
に設定されます。これはテストを行う標準的な方法であり、デバイス上のオーケストレーションは無効になります。
- デバイス上のテスト オーケストレーションを使用するかどうかを決定する
android { testOptions { execution 'ANDROID_TEST_ORCHESTRATOR' } }* 新しい androidTestUtil 依存関係コンフィグレーションにより、インストゥルメンテーション テスト(Android Test Orchestrator など)を実行する前に、別のテストヘルパー APK をインストールできるようになりました。
dependencies { androidTestUtil 'com.android.support.test:orchestrator:1.0.0' ... }* [Roboelectric](http://robolectric.org/)などの Android リソースを必要とする単体テストをサポートするために、testOptions.unitTests.includeAndroidResources を追加しました。このプロパティを true に設定すると、プラグインは単体テストを実行する前に、リソース、アセット、マニフェストのマージを実施します。テストでは、次のキーのクラスパスで com/android/tools/test_config.properties を検査できます。 * android_merged_assets: マージされたアセット ディレクトリへの絶対パス。
注: ライブラリ モジュールの場合、マージされたアセットに依存関係のアセットは含まれません([問題 #65550419](https://issuetracker.google.com/65550419)参照)。
* android_merged_manifest: マージされたマニフェスト ファイルへの絶対パス。* android_merged_resources: マージされたリソース ディレクトリへの絶対パス。モジュールのすべてのリソースと依存関係が含まれます。 * android_custom_package: 最後の R クラスのパッケージ名。アプリケーション ID を動的に変更する場合、このパッケージ名は、アプリのマニフェストの package 属性と一致しないことがあります。 * [リソースとしてのフォント](/guide/topics/ui/look-and-feel/fonts-in-xml.html)をサポートしました。これは [Android 8.0(API レベル 26)](/about/versions/oreo/index.html)で導入された新機能です。 * [Android Instant Apps SDK 1.1](/topic/instant-apps/release-notes.html#android_instant_apps_development_sdk_v110)以降での言語固有の APK をサポートしました。詳細については、[単純分割用のビルドの設定](/topic/instant-apps/guides/config-splits.html)をご覧ください。 * 次のように、外部のネイティブ ビルド プロジェクトの出力ディレクトリを変更できるようになりました。android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory "./outputs/cmake" } } }* Android Studio からネイティブ プロジェクトをビルドするときに [CMake 3.7 以降を使用](/studio/projects/add-native-code.html#vanilla_cmake)できるようになりました。 * 新しい lintChecks 依存関係コンフィグレーションにより、カスタム lint ルールを定義する JAR を作成し、AAR や APK のプロジェクトにパッケージ化できます。カスタム lint ルールは、単一の JAR を出力し、[compileOnly](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_dependency_management)依存関係のみを含む、別のプロジェクトに属している必要があります。他のアプリやライブラリ モジュールは、lintChecks コンフィグレーションを使用して lint プロジェクトに依存できます。
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks project(':lint-checks') }
動作の変更
- Android プラグイン 3.0.0 では特定の API が削除されるため、その API を使用するとビルドが失敗します。たとえば、Variants API を使用して
outputFile()
オブジェクトにアクセスすることや、processManifest.manifestOutputFile()
を使用して各バリアントのマニフェスト ファイルを取得することはできなくなりました。詳細については、API の変更をご覧ください。 - ビルドツールのバージョンを指定する必要がなくなりました(そのため、
android.buildToolsVersion
プロパティを削除できるようになりました)。デフォルトでは、使用しているバージョンの Android プラグインに最小限必要なバージョンのビルドツールが自動的に使用されます。 - 次のように、
buildTypes
ブロックで PNG 自動最適化を有効にします。すべてのビルドについて PNG 自動最適化がデフォルトで有効になっていますが、PNG ファイルが多く含まれるプロジェクトではビルド時間が長くなることから、デバッグビルドは除きます。そのため、他のビルドタイプのビルド時間を改善するには、PNG 自動最適化を無効にするか、画像を WebP に変換する必要があります。
android { buildTypes { release { // Disables PNG crunching for the release build type. crunchPngs false } } }* Android プラグインは、外部の CMake プロジェクトで設定する実行可能ターゲットを自動的にビルドするようになりました。 * annotationProcessor 依存関係コンフィグレーションを使用してプロセッサ クラスパスに[アノテーション プロセッサを追加する](/studio/build/dependencies#annotation_processor)必要があります。 * ndkCompile の使用が制限されるようになりました。代わりに、CMake または ndk-build を使用して、APK にパッケージ化するネイティブ コードをコンパイルするよう移行する必要があります。詳細については、[ndkcompile から移行する](/studio/projects/add-native-code.html#ndkCompile)をご覧ください。 ## 2.3.0(2017 年 2 月){:#2-3-0}
2.3.3(2017 年 6 月)
Android Studio 2.3.3 との互換性を追加するマイナー アップデートです。
2.3.2(2017 年 5 月)
Android Studio 2.3.2 との互換性を追加するマイナー アップデートです。
2.3.1(2017 年 4 月)
Android プラグイン 2.3.0 のマイナー アップデートです。一部の物理 Android デバイスが Instant Run で正常に動作しなかった問題を修正しました(問題 235879 参照)。
- 依存関係:
-
- Gradle 3.3 以降。
- Build Tools 25.0.0 以降。
- 新規:
-
- パフォーマンスの改善と新機能が含まれる Gradle 3.3 を使用します。詳細については、Gradle のリリースノートをご覧ください。
-
ビルド キャッシュ: プロジェクトをビルドするときに Android プラグインが生成する特定の出力(非パッケージ化 AAR、事前 DEX 変換済みのリモート依存関係など)を保存します。キャッシュされたファイルは、ビルドシステムが以降のビルドを行う際に再利用できるため、再生成の手間が省け、クリーンビルドの時間が大幅に短縮されます。Android プラグイン 2.3.0 以降を使用しているプロジェクトでは、デフォルトでビルド キャッシュが使用されます。詳細については、ビルド キャッシュによるクリーンビルドの高速化をご覧ください。
- ビルド キャッシュを削除する
cleanBuildCache
タスクが含まれています。 - 試験運用版のビルド キャッシュ(以前のバージョンのプラグインに含まれるもの)を使用している場合、プラグインをアップデートして最新バージョンにする必要があります。
- ビルド キャッシュを削除する
- 変更内容:
-
- Android Studio 2.3 に含まれる Instant Run の変更をサポート。
- 非常に大規模なプロジェクトでは、設定に要する時間が大幅に短縮されます。
- Constraint Layout ライブラリの自動ダウンロードに関する問題を修正しました。
- プラグインが ProGuard バージョン 5.3.2 を使用するようになりました。
- 報告されたバグの修正が多数含まれています。問題が発生した場合は、引き続きバグレポートをお寄せください。
- 依存関係:
-
- Gradle 2.14.1 以降。
- Build Tools 23.0.2 以降。
- 新規:
-
- パフォーマンスの改善と新機能が含まれる Gradle 2.14.1 を使用します。また、Gradle 使用時のローカル権限昇格を可能にするセキュリティ脆弱性を修正しました。詳細については、Gradle のリリースノートをご覧ください。
- Gradle では、
externalNativeBuild {}
DSL を使用することで、ネイティブ ソースにリンクし、CMake や ndk-build を使用してネイティブ ライブラリをコンパイルできるようになりました。Gradle は、ネイティブ ライブラリを作成した後、APK にパッケージ化します。CMake と ndk-build を Gradle で使用する方法については、プロジェクトへの C / C++ コードの追加をご覧ください。 - コマンドラインからビルド実行すると、Gradle は不足している SDK コンポーネントやプロジェクトが依存しているアップデートの自動ダウンロードを試みます。詳細については、不足しているパッケージの Gradle での自動ダウンロードをご覧ください。
- 新しい試験運用版のキャッシュ機能により、Gradle では、事前 DEX 変換済みバージョンのライブラリを pre-dex し、保存し、再利用することで、ビルド時間を短縮できます。この試験運用版機能の使用方法について詳しくは、ビルド キャッシュのガイドをご覧ください。
- 圧縮、署名、zipalign を 1 つのタスクで処理する新しいデフォルトのパッケージ化パイプラインを採用することで、ビルドのパフォーマンスを改善しました。
gradle.properties
ファイルにandroid.useOldPackaging=true
を追加すると、以前のパッケージ化ツールを使用するように戻せます。新しいパッケージ化ツールの使用中、zipalignDebug
タスクは使用できません。ただし、createZipAlignTask(String taskName, File inputFile, File outputFile)
メソッドを呼び出すことで、独自に作成できます。 - APK 署名では、従来の JAR 署名に加えて APK 署名スキーム v2 が使用されるようになりました。生成される APK は、すべての Android プラットフォームで受け入れられます。署名後にこれらの APK を変更すると、v2 署名が無効になり、デバイスへのインストールができなくなります。この機能を無効にするには、モジュール レベルの
build.gradle
ファイルに次のコードを追加します。android { ... signingConfigs { config { ... v2SigningEnabled false } } }
- multidex ビルドでは、ProGuard ルールを使用して、Gradle でアプリのメインの DEX ファイルにコンパイルする必要があるクラスを決定できるようになりました。Android システムはアプリの起動時にメインの DEX ファイルを最初に読み込むため、特定のクラスをメインの DEX ファイルにコンパイルすることで、起動時に優先順位を付けられます。メインの DEX ファイル専用の ProGuard 設定ファイルを作成してから、
buildTypes.multiDexKeepProguard
を使用して、設定ファイルのパスを Gradle に渡します。この DSL の使用は、アプリの一般的な ProGuard ルールを提供しメイン DEX ファイルのクラスを指定しないbuildTypes.proguardFiles
の使用とは異なります。 - デバイスにインストールするときにアプリのサイズを小さくできる
android:extractNativeLibs
フラグのサポートを追加しました。アプリのマニフェストの<application>
要素でこのフラグをfalse
に設定すると、Gradle は圧縮されていないバージョンと調整されたバージョンのネイティブ ライブラリを APK にパッケージ化します。これにより、PackageManager
がインストール時に APK からデバイスのファイル システムにネイティブ ライブラリをコピーできなくなり、アプリの差分アップデートを小さくできるというメリットもあります。 - プロダクト フレーバーに
versionNameSuffix
とapplicationIdSuffix
を指定できるようになりました(問題 59614)。
- 変更内容:
-
-
getDefaultProguardFile
は、Android Plugin for Gradle が提供するデフォルトの ProGuard ファイルを返すようになり、Android SDK のファイルを使用しなくなりました。 - Jack コンパイラのパフォーマンスと機能を改善しました:
testCoverageEnabled
をtrue
に設定すると、Jack で Jacoco テスト カバレッジがサポートされるようになりました。- アノテーション プロセッサのサポートを改善しました。
compile
依存関係など、クラスパス上のアノテーション プロセッサは、ビルドに自動的に適用されます。ビルドでアノテーション プロセッサを指定し、モジュール レベルのbuild.gradle
ファイルでjavaCompileOptions.annotationProcessorOptions {}
DSL を使用して引数を渡すこともできます。android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { className 'com.example.MyProcessor' // Arguments are optional. arguments = [ foo : 'bar' ] } } } }
コンパイル時にアノテーション プロセッサを適用するが APK に含めないという場合は、
annotationProcessor
依存関係スコープを使用します。dependencies { compile 'com.google.dagger:dagger:2.0' annotationProcessor 'com.google.dagger:dagger-compiler:2.0' // or use buildVariantAnnotationProcessor to target a specific build variant }
jackOptions.additionalParameters()
を使用して Jack に追加のフラグを設定できます。次のコード スニペットは、jack.incremental
パラメータをtrue
に設定します。android { defaultConfig { ... jackOptions { enabled true additionalParameters("jack.incremental" : true) } } }
設定可能なパラメータのリストについては、コマンドラインから次のコマンドを実行します。
java -jar /build-tools/jack.jar --help-properties
- Gradle デーモンのヒープサイズが 1.5 GB 以上の場合、Jack はデフォルトで Gradle と同じプロセスで実行されるようになりました。デーモンのヒープサイズを調整するには、
gradle.properties
ファイルに次の行を追加します。# This sets the daemon heap size to 1.5GB. org.gradle.jvmargs=-Xmx1536M
-
2.1.0(2016 年 4 月)
2.1.3(2016 年 8 月)
このアップデートには、Gradle 2.14.1 以降が必要です。Gradle 2.14.1 には、パフォーマンスの改善、新機能、重要なセキュリティ修正が含まれています。詳細については、Gradle のリリースノートをご覧ください。
- 依存関係:
-
- Gradle 2.10 以降。
- Build Tools 23.0.2 以降。
- 新規:
-
- N Developer Preview、JDK 8、Jack ツールチェーンを使用した Java 8 言語機能のサポートを追加しました。詳細については、N Preview のガイドをご覧ください。
注: Instant Run は、現段階では Jack と併用できません。そのため新しいツールチェーンの使用中は無効になります。N Preview 向けに開発していて、サポートされている Java 8 言語機能を使用する場合に限り、Jack を使用する必要があります。
- 開発中のコンパイル時間を短縮するために、増分 Java コンパイルのデフォルト サポートが追加されました。これは、ソースのうち変更された部分や再コンパイルが必要な部分だけを再コンパイルすることで行われます。この機能を無効にするには、モジュール レベルの
build.gradle
ファイルに次のコードを追加します。android { ... compileOptions { incremental false } }
-
個々の外部 VM プロセスではなくビルドプロセス内で dex を行う、プロセス内 dex のサポートを追加しました。これにより、増分ビルドが高速化されるだけでなく、フルビルドも高速化されます。Gradle デーモンの最大ヒープサイズが 2,048 MB 以上に設定されたプロジェクトでは、この機能がデフォルトで有効になります。そのためには、プロジェクトの
gradle.properties
ファイルで次のように指定します。org.gradle.jvmargs = -Xmx2048m
モジュール レベルの
build.gradle
ファイルでjavaMaxHeapSize
の値を定義した場合、org.gradle.jvmargs
をjavaMaxHeapSize
+ 1,024 MB の値に設定する必要があります。たとえば、javaMaxHeapSize
を「2048m」に設定した場合、プロジェクトのgradle.properties
ファイルに次の行を追加する必要があります。org.gradle.jvmargs = -Xmx3072m
プロセス内 dex を無効にするには、モジュール レベルの
build.gradle
ファイルに次のコードを追加します。android { ... dexOptions { dexInProcess false } }
- N Developer Preview、JDK 8、Jack ツールチェーンを使用した Java 8 言語機能のサポートを追加しました。詳細については、N Preview のガイドをご覧ください。
2.0.0(2016 年 4 月)
- 依存関係:
-
- Gradle 2.10 以降。
- Build Tools 21.1.1 以降。
- 新規:
-
- バイトコード インジェクションをサポートし、エミュレータや物理デバイスで実行中のアプリにコードとリソースのアップデートをプッシュすることで、Instant Run を有効にします。
- アプリが実行されていない場合についても、増分ビルドのサポートを追加しました。接続されているデバイスに Android Debug Bridge を介して増分変更をプッシュすることで、フルビルドの時間が改善されます。
- 同時に生成できるスレーブ dex プロセスの数を制御する
maxProcessCount
を追加しました。モジュール レベルのbuild.gradle
ファイルで、次のコードは同時プロセスの最大数を 4 に設定しています。android { ... dexOptions { maxProcessCount = 4 // this is the default value } }
- pre-dex をサポートし依存関係の re-dex を減らす、試験運用版のコード圧縮ツールを追加しました。このような機能は Proguard ではサポートされていません。これにより、デバッグビルド バリアントのビルド速度が改善されます。試験運用版圧縮ツールは最適化と難読化をサポートしていないため、リリースビルドでは Proguard を有効にする必要があります。デバッグビルドで試験運用版圧縮ツールを有効にするには、モジュール レベルの
build.gradle
ファイルに次のコードを追加します。android { ... buildTypes { debug { minifyEnabled true useProguard false } release { minifyEnabled true useProguard true // this is a default setting } } }
- ロギングのサポートを追加し、リソース圧縮ツールのパフォーマンスを改善しました。リソース圧縮ツールは、すべての動作を Proguard ログファイルと同じフォルダにある
resources.txt
ファイルに記録するようになりました。
- 変更された動作:
-
minSdkVersion
が 18 以上に設定されている場合、APK 署名は SHA256 を使用します。- DSA キーと ECDSA キーで、APK パッケージに署名できるようになりました。
注: Android キーストア プロバイダは、Android 6.0(API レベル 23)以降で DSA キーをサポートしなくなりました。
- 修正された問題:
-
- テスト設定とメインのビルド設定の両方で AAR 依存関係が重複する問題を修正しました。