Build Analyzer でビルド パフォーマンスをトラブルシューティングする

Build Analyzer を使用すると、プロジェクトのビルド パフォーマンスを検査できます。ビルド パフォーマンスはさまざまな要因の影響を受ける可能性があり、そうした要因はビルドによって異なります。Build Analyzer は、ビルドを実行するたびに重要な情報を表示するので、ビルド パフォーマンスが低下している場合はすばやく発見して解決できます。

このページでは、Build Analyzer の概要について説明し、このツールを使用してプロジェクトのビルド パフォーマンスを向上させる方法を紹介します。ビルド パフォーマンスを向上させるその他の戦略については、ビルド速度を最適化するをご覧ください。

Build Analyzer が表示するデータは、ビルドによって異なります。特に、大規模で複雑なビルドではビルドによって異なる要因が数多くあります。したがって、ビルド時間における重要な要因として Build Analyzer が表示するデータも変化します。そのため、プロジェクトのビルドを複数回繰り返して Build Analyzer のデータを比較し、それぞれのパターンを特定することが有効です。

始める

アプリをビルドするたびに Build Analyzer によってレポートが作成され、最新のレポートのデータが [Build] ウィンドウに表示されます。

最初に、次の手順を実施します。

  1. まだアプリをビルドしていない場合は、次のいずれかの方法でビルドします。
    • メニューバーで [Build] > [Make Project] をクリックします。
    • Android App Bundle または APK をビルドするには、メニューバーで [Build] > [Build Bundle(s) / APK(s)] > [Build Bundle(s)] または [Build] > [Build Bundle(s) / APK(s)] > [Build APK(s)] をクリックします。
  2. [Build] ウィンドウを開くには、メニューバーから [View] > [Tool Windows] > [Build] を選択します。
  3. Build Analyzer でビルドレポートを表示するには、[Build] ウィンドウの [Build Analyzer] タブをクリックします。

ビルド時間に影響しているタスクを含むプラグインを表示する

ビルドの完了後に初めて Build Analyzer を開くと、図 1 に示すように、ビルド分析の概要がウィンドウに表示されます。

図 1. Build Analyzer の概要ページに検出結果の概要が表示されます。

ビルド時間に影響しているタスクを含むプラグインの内訳を表示するには、概要ページで [Plugins with tasks impacting build duration] をクリックします。また、プルダウンから [Tasks] を選択すると、[Group by plugin] が選択されていることを確認できます。

図 2. Build Analyzer に、ビルド時間に大きく影響しているプラグインの内訳が表示されます。

タスクペインには、ビルド時間に影響しているタスクが表示されます。問題のあるタスクの横に警告アイコンが表示されます。

グラフには、タスクが全体のビルド時間に影響している割合が示されます。

詳細ペインには、選択されているタスクで検出された問題に関する詳細情報が表示されます。

各ノードには、そのノードの直接の子を実行するのにかかった合計時間が表示されます。この時間を知ることにより、ビルド時間に大きく影響しているタスクの調査に集中できます。

ビルド時間に影響しているタスクを表示する

ビルド時間に影響しているタスクの内訳を表示するには、概要ページで [Tasks impacting build duration] をクリックします。また、プルダウンから [Tasks] を選択すると、[Group by plugin] が選択されていないことを確認できます。

図 3. Build Analyzer に、ビルド時間に大きく影響しているタスクの内訳が表示されます。

Gradle は、タスクの相互依存関係、プロジェクト構造、CPU 負荷によってタスクの実行方法を決定し、タスクを順次実行または並列実行します。特定のビルドの Build Analyzer には、順次実行され、現在のビルド時間に影響を与えたタスクセットがハイライト表示されます。このようにハイライト表示されたタスクの非効率性に対処することが、全体のビルド時間を短縮するための最適な出発点です。

実行するビルドごとに、ビルド時間に影響するタスクセットの表示が異なることがあります。たとえば、ビルド構成に変更を加えた場合、異なるタスクセットでビルドを実行した場合(増分ビルドなど)、異なる制約の下でビルドを実行した場合は、[Build Speed] ウィンドウでハイライト表示される、ビルド時間に大きく影響したタスクセットが変化することがあります。このような変動性があるため、複数のビルドで [Build Speed] ウィンドウを確認して、どの場合でもビルド時間を短縮することをおすすめします。

各タスクは次のように色分けされます。

  • 明るい青: Android Gradle プラグイン、Java Gradle プラグイン、または Kotlin Gradle プラグインに含まれるタスク。
  • 青: サードパーティ プラグインまたはカスタム プラグインに含まれるタスク。たとえば、Android Studio を使用して新しいプロジェクトを作成した後で適用したプラグインなどです。
  • 紫: プラグインに含まれていないが、実行時にプロジェクト プロパティを動的に変更するために使用されるタスク。たとえば、build.gradle ファイル内で定義したタスクなどです。
  • グレー: Build Analyzer でハイライト表示されている他のタスクと比べると、ビルド時間への影響がそれほど大きくないタスク。

個々の子タスクをクリックすると、その実行の詳細を確認できます。たとえば、親プラグイン、タスクタイプ、このタスクが実行される原因となった他のタスク、タスクが増分実行されたかどうかなどの詳細な情報が提供されます(図 2 を参照)。また、Build Analyzer は警告を表示することもあります。そうした警告は、より実行効率が高くなるようにタスクを構成するのに役立ちます。

警告を調べる

Build Analyzer は、より実行効率が高くなるように構成できるタスクを検出すると、警告を表示します。

たとえば、適切な Gradle API を使用して入力と出力を指定していないタスクは、増分ビルドのメリットを活用できません。ビルドにそのようなタスクが含まれている場合、Build Analyzer はそのビルドに Always-run 警告のフラグを付けます。そのようなタスクは、入力が変更されたかどうかにかかわらず、すべてのビルドで実行されるからです。

Build Analyzer がビルドで検出したすべての警告を確認するには、概要ページで [All warnings] をクリックするか、プルダウンから [Warnings] を選択します。[Warnings] ビューには、カテゴリ別に分類された警告が表示されます。たとえば、[Always-run] ノードには、増分ビルド用に適切に構成されていないと判定されたタスクが分類されます。

子ノードをクリックすると、警告の内容と、問題を解決するために実施できる手順が表示されます。さらに、プロジェクトに適用したプラグインにタスクが含まれている場合は、図 4 に示すように、[Generate report] リンクが表示されます。

図 4. Build Analyzer の警告に関する詳細情報。

[Generate report] をクリックすると、プラグインのデベロッパーが新しいバージョンのプラグインで問題を解決するために役立つ追加情報がダイアログに表示されます。[Copy] をクリックすると、テキストがクリップボードに保存されるので、プラグインのデベロッパーに送るバグレポートに簡単に貼り付けることができます。

警告の種類

Build Analyzer が報告する警告の種類は次のとおりです。

  • Always run tasks: 常に実行されるタスクは、ビルドのたびに他のタスクの実行を引き起こしますが、これは不要です。この警告が表示される主な理由には、以下の 2 つがあります。

    • (よくあるケース)タスクの入力と出力を正しく宣言していなかった。この場合は、タスクの入力と出力を正しく宣言する必要があります。つまり、可能な場合は手動で入力と出力を宣言し、サードパーティ プラグインからのタスクが警告をトリガーしている場合はプラグインのバージョンを変更します。

    • (それほど一般的でないケース)タスクで upToDateWhen が false に設定されている。このような設定は避ける必要があります。なんらかのロジックで false と判定しているか、upToDateWhen が false にハードコードされている可能性があります。ロジックで false と判定している場合は、その結果は意図どおりであり、警告を無視できます。upToDateWhen が false にハードコードされている場合は、コードからそれを削除する必要があります。

  • Task setup issues: この警告は、タスクにおいて出力と同じディレクトリが宣言されている場合に生成されます。このようなタスク出力はビルド間で保持されない可能性が高く、そうしたタスクは変更がなくても常に実行されます。この警告に対処するには、タスクごとに異なる出力ディレクトリを宣言する必要があります。つまり、可能な場合は手動で別の出力ディレクトリを宣言し、サードパーティ プラグインからのタスクが警告をトリガーしている場合はプラグインのバージョンを変更します。

  • Non-incremental annotation processor: この警告は、アノテーション プロセッサが非増分で、そのために JavaCompile タスクが常に非増分実行される場合に生成されます。この警告に対処するには、増分アノテーション プロセッサに切り替えます

  • Configuration cache: この警告は、プロジェクトで構成キャッシュが有効になっていない場合に表示されます。Build Analyzer は、ビルドを 1 つずつ調べて、プロジェクトに構成キャッシュとの互換性があるかどうかを確認します。互換性があることが確認できた場合は、Build Analyzer から構成キャッシュを有効にできます。

  • Check Jetifier: この警告は、enableJetifier フラグが存在し、プロジェクトで有効になっている場合(つまり、gradle.properties ファイルに android.enableJetifier=true が含まれている場合)に表示されます。Build Analyzer により、プロジェクトのビルド パフォーマンスを改善するためにこのフラグを安全に削除できるかどうかと、保守されていない Android サポート ライブラリから移行できるかどうかを確認できます。

ダウンロードの影響を確認する

Build Analyzer を使用すると、依存関係のダウンロードに要した時間の概要と、リポジトリごとのダウンロードの詳細を確認できます。ダウンロードの影響を確認するには、プルダウンから [Downloads] を選択します。

この情報を使用して、予期せぬ依存関係のダウンロードがビルドのパフォーマンスに悪影響を与えているかどうかを確認できます。これは、アーティファクトを一貫してダウンロードしない増分ビルドで特に重要です。

特に重要な点として、この情報を使用し、予期せぬダウンロードを引き起こす依存関係の動的バージョンの使用など、構成の問題を特定できます。また、特定のリポジトリで多数のリクエストが失敗している場合は、リポジトリを削除するか、リポジトリ構成の下位に移動する必要があることを示している可能性があります。

図 5. Build Analyzer により、ダウンロードがビルド時間に与える影響が示されている。