Android Gradle プラグイン 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 をサポートするマイナー アップデートです。全般的なバグの修正とパフォーマンスの改善が含まれています。

最適化

  • 詳細なタスクグラフによるマルチモジュール プロジェクトの並列処理の改善。
  • Gradle は、依存関係を変更する場合、その依存関係の API にアクセスできないモジュールを再コンパイルしないことにより、ビルドを高速化します。 Gradle の新しい依存関係コンフィグレーションimplementationapicompileOnlyruntimeOnly)を使用して、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 を使用してダウンロードできます)をサポートする、新しい機能モジュール プラグインが含まれています。新しいプラグインによる機能モジュールの作成の詳細については、複数の機能を備えた Instant App の構造をご覧ください。
  • 特定の 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 に設定されます。これはテストを行う標準的な方法であり、デバイス上のオーケストレーションは無効になります。

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • 新しい androidTestUtil 依存関係コンフィグレーションにより、インストルメンテーション テスト(Android Test Orchestrator など)を実行する前に、別のテストヘルパー APK をインストールできるようになりました。

    Groovy

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • Roboelectric などの Android リソースを必要とする単体テストをサポートするために、testOptions.unitTests.includeAndroidResources を追加しました。このプロパティを true に設定すると、プラグインは単体テストを実行する前に、リソース、アセット、マニフェストのマージを実施します。 テストでは、次のキーのクラスパスで com/android/tools/test_config.properties を検査できます。

    • android_merged_assets: マージされたアセット ディレクトリへの絶対パス。

      注: ライブラリ モジュールの場合、マージされたアセットに依存関係のアセットは含まれません(問題 #65550419 参照)。

    • android_merged_manifest: マージされたマニフェスト ファイルへの絶対パス。

    • android_merged_resources: マージされたリソース ディレクトリへの絶対パス。モジュールのすべてのリソースと依存関係が含まれます。

    • android_custom_package: 最後の R クラスのパッケージ名。アプリケーション ID を動的に変更する場合、このパッケージ名は、アプリのマニフェストの package 属性と一致しないことがあります。

  • リソースとしてのフォントをサポートしました。これは Android 8.0(API レベル 26)で導入された新機能です。
  • Android Instant Apps SDK 1.1 以降での言語固有の APK をサポートしました。
  • 次のように、外部のネイティブ ビルド プロジェクトの出力ディレクトリを変更できるようになりました。

    Groovy

            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"
                    }
                }
            }
            

    Kotlin

            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 以降を使用できるようになりました。
  • 新しい lintChecks 依存関係コンフィグレーションにより、カスタム lint ルールを定義する JAR を作成し、AAR や APK のプロジェクトにパッケージ化できます。

    カスタム lint ルールは、単一の JAR を出力し、compileOnly 依存関係のみを含む、別のプロジェクトに属している必要があります。他のアプリやライブラリ モジュールは、lintChecks コンフィグレーションを使用して lint プロジェクトに依存できます。

    Groovy

            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')
            }
            

    Kotlin

            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 に変換する必要があります。

    Groovy

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • Android プラグインは、外部の CMake プロジェクトで設定する実行可能ターゲットを自動的にビルドするようになりました。
  • annotationProcessor 依存関係コンフィグレーションを使用してプロセッサ クラスパスにアノテーション プロセッサを追加する必要があります。
  • 非推奨の ndkCompile の使用制限が強化されました。 代わりに、CMake または ndk-build のいずれかを使用して、APK にパッケージ化するネイティブ コードをコンパイルする方法に移行する必要があります。詳細については、ndkcompile から移行するをご覧ください。