Android Gradle プラグイン 3.6.0(2020 年 2 月)

このバージョンの Android プラグインには、次のものが必要です。

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

3.6.4(2020 年 7 月)

このマイナー アップデートでは、Android 11 でのパッケージの公開設定に関する新しいデフォルト設定と各種機能との互換性が確保されています。

詳細については、4.0.1 リリースノートをご覧ください。

新機能

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

ビュー バインディング

ビュー バインディングにより、コード内のビューを参照する際にコンパイル時の安全性を実現します。 findViewById() は、自動生成されたバインディング クラス参照に置き換えることができるようになりました。ビュー バインディングを使用するには、各モジュールの build.gradle ファイルに次の行を含めます。

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

詳細については、ビュー バインディングのドキュメントをご覧ください。

Maven Publish プラグインのサポート

Android Gradle プラグインには、Maven Publish Gradle プラグインのサポートが含まれています。これにより、ビルド アーティファクトを Apache Maven リポジトリに公開できます。Android Gradle プラグインは、アプリまたはライブラリ モジュール内のビルド バリアント アーティファクトごとにコンポーネントを作成します。これを使用して、Maven リポジトリへのパブリケーションをカスタマイズできます。

詳細については、Maven Publish プラグインを使用する方法についてのページをご覧ください。

新しいデフォルトのパッケージ化ツール

アプリのデバッグ バージョンをビルドする場合、プラグインは zipflinger という新しいパッケージ化ツールを使用して APK をビルドします。この新しいツールを使用すると、ビルド速度が向上します。この新しいパッケージ化ツールが期待どおりに動作しない場合は、バグを報告してください。以前のパッケージ化ツールを使用するには、次の行を gradle.properties ファイルに含めます。

        android.useNewApkCreator=false
      

ネイティブ ビルド アトリビューション

プロジェクトの各 C / C++ ファイルを Clang でビルドしてリンクするのにかかる時間を測定できるようになりました。Gradle はこれらのコンパイラ イベントのタイムスタンプを含む Chrome トレースを出力できるため、プロジェクトをビルドするのに必要な時間を詳細に把握できます。このビルド アトリビューション ファイルを出力する手順は次のとおりです。

  1. Gradle ビルドを実行するときに、フラグ -Pandroid.enableProfileJson=true を追加します。次に例を示します。

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Chrome ブラウザを開き、検索バーに「chrome://tracing」と入力します。

  3. [Load] ボタンをクリックし、<var>project-root</var>/build/android-profile に移動して、profile-<var>timestamp</var>.json.gz という名前のファイルを探します。

ネイティブ ビルド アトリビューション データがビューアの上部に表示されます。

Chrome のネイティブ ビルド アトリビューション トレース

動作の変更

このバージョンのプラグインを使用する場合、以下のように動作が変更されます。

非圧縮ネイティブ ライブラリのパッケージ化(デフォルト)

アプリをビルドするときに、プラグインによってデフォルトで extractNativeLibs"false" に設定されるようになりました。つまり、ネイティブ ライブラリのページ アライメントとパッケージ化が圧縮なしで行われます。その結果、アップロード サイズは大きくなりますが、ユーザーには次のようなメリットがあります。

  • プラットフォームはインストール済みの APK からネイティブ ライブラリに直接アクセスできるため、アプリのインストール サイズが小さくなります。しかも、ライブラリのコピーを作成する必要がありません。
  • APK または Android App Bundle に非圧縮ネイティブ ライブラリを含めると、通常は Play ストアの圧縮効率が向上するため、ダウンロード サイズが小さくなります。

Android Gradle プラグインで圧縮ネイティブ ライブラリをパッケージ化する場合は、アプリのマニフェストに次の行を含めます。

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

注: extractNativeLibs マニフェスト属性は、useLegacyPackaging DSL オプションに置き換えられました。詳細については、リリースノートの DSL を使用して圧縮ネイティブ ライブラリをパッケージ化するをご覧ください。

デフォルトの NDK バージョン

複数のバージョンの NDK をダウンロードした場合、Android Gradle プラグインはデフォルトのバージョンを選択するようになりました。ソースコード ファイルのコンパイルでは、このデフォルトのバージョンが使用されます。プラグインは以前は、最近ダウンロードされたバージョンの NDK を選択していました。プラグインが選択したデフォルトのバージョンをオーバーライドするには、モジュールの build.gradle ファイル内の android.ndkVersion プロパティを使用します。

R クラス生成の簡素化

Android Gradle プラグインは、プロジェクトのライブラリ モジュールごとに R クラスを 1 つだけ生成し、その R クラスを他のモジュール依存関係と共有することで、コンパイル クラスパスを簡素化します。この最適化によってビルドが高速化されますが、以下の点に留意する必要があります。

  • コンパイラは R クラスを上流のモジュール依存関係と共有するため、プロジェクト内の各モジュールで一意のパッケージ名を使用することが重要です。
  • 他のプロジェクト依存関係からライブラリの R クラスを参照できるかどうかは、ライブラリを依存関係として含めるために使用するコンフィグレーションによって決まります。たとえば、ライブラリ A に「api」依存関係としてライブラリ B が含まれている場合、ライブラリ A と、ライブラリ A に依存する他のライブラリは、ライブラリ B の R クラスを参照できます。ただし、他のライブラリはライブラリ B の R クラスを参照できない場合があります。それは、ライブラリ A が implementation 依存関係コンフィグレーションを使用している場合です。詳細については、依存関係コンフィグレーションをご覧ください。

デフォルトの設定にないリソースの削除

ライブラリ モジュールに関して、デフォルトのリソースセットに含まれていない言語のリソースを含める場合(hello_world/values-es/strings.xml に文字列リソースとして含まれているが、そのリソースが /values/strings.xml で定義されていない場合など)、Android Gradle プラグインはプロジェクトのコンパイル時にそのリソースを含めなくなりました。この動作変更により、Resource Not Found ランタイム例外の発生が減少し、ビルド速度が向上します。

アノテーションに適用される CLASS 保持ポリシーの考慮(D8)

D8 において、アプリのコンパイル中にアノテーションが CLASS 保持ポリシーを適用するタイミングが考慮されるようになりました。また、これらのアノテーションは、実行時には使用できなくなりました。この動作は、アプリのターゲット SDK を API レベル 23 に設定するときにも行われます。そのため以前は、Android Gradle プラグインと D8 の古いバージョンを使用してアプリをコンパイルする場合、実行時にこれらのアノテーションにアクセスすることができました。

その他の動作の変更

  • aaptOptions.noCompress は、すべてのプラットフォーム(APK とバンドルの両方)で大文字と小文字が区別されなくなり、大文字を使用するパスが優先されなくなりました。
  • データ バインディングがデフォルトでインクリメンタルになりました。詳細については、問題 #110061530 をご覧ください。

  • すべての単体テスト(Roboelectric 単体テストを含む)がキャッシュ可能になりました。詳細については、問題 #115873047 をご覧ください。

バグの修正

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

  • Robolectric 単体テストが、データ バインディングを使用するライブラリ モジュールでサポートされるようになりました。詳細については、問題 #126775542 をご覧ください。
  • Gradle の並列実行モードが有効になっている場合に、複数のモジュールで connectedAndroidTest タスクを実行できるようになりました。

既知の問題

このセクションでは、Android Gradle プラグイン 3.6.0 に存在する既知の問題について説明します。

Android Lint タスクのパフォーマンスの低下

Android Lint は、解析インフラストラクチャでの回帰が原因で、一部のプロジェクトにおいて完了までに非常に時間がかかることがあります。そのため、特定のコード構造では、ラムダの推定型の計算速度が低下します。

この問題は IDEA のバグとして報告されており、Android Gradle プラグイン 4.0 で修正される予定です。

マニフェスト クラスがない {:#agp-missing-manifest}

アプリのマニフェストでカスタム権限を定義している場合、Android Gradle プラグインは通常、カスタム権限を文字列定数として含む Manifest.java クラスを生成します。Android Gradle プラグインはこのクラスをアプリにパッケージ化するため、ランタイムにこれらの権限を簡単に参照できます。

Android Gradle プラグイン 3.6.0 では、マニフェスト クラスの生成は行われません。 このバージョンのプラグインでアプリをビルドし、そのアプリでマニフェスト クラスを参照すると、ClassNotFoundException 例外が発生することがあります。この問題を解決するには、以下のいずれかを行います。

  • カスタム権限を完全修飾名で参照します。 例: "com.example.myapp.permission.DEADLY_ACTIVITY"

  • 次のように独自の定数を定義します。

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }