🐈

GradleのConfiguration cacheについて

2023/03/09に公開

Configuration cacheとは何か?

Configuration cacheは、GradleのビルドのConfiguration phaseでのタスクグラフに関する情報をキャッシュとして保存し、その後のビルドで再利用することで、ビルドパフォーマンスを改善することができます。

Configuration cacheを有効にしたAndroidアプリのビルド時間が、有効にする前と比べてかなり改善したという話もあり、ビルドパフォーマンスには結構影響が大きそうです。
https://developer.squareup.com/blog/5-400-hours-a-year-saving-developers-time-and-sanity-with-gradles/

Configuration cacheはbuild cacheとは違うものになります。
build cacheがタスク出力やArtifact変換出力など、ビルドの出力や中間ファイルをキャッシュするのに対して、Configuration cacheは、特定のタスクセットに対するビルド構成をキャッシュするようになっています。
build cacheは、build phaseでいうところの、Execution phaseの出力をキャッシュし、Configuration cacheはConfiguration phaseの出力をキャッシュするようになっています。

どうやって有効化するのか?

gradle.propertiesに以下を追加すると、Configuration cacheを有効化することができます。(デフォルトでは無効になっています。)

org.gradle.unsafe.configuration-cache=true
org.gradle.unsafe.configuration-cache-problems=warn

Configuration cacheを有効にすると、1回目の実行後にCalculating task graph as no configuration cache is available for tasks...と表示され、2回目の実行からは
Reusing configuration cache.が表示されるようになります。

プロジェクトで使用しているライブラリのバージョンによっては、Configuration cacheに対応していないライブラリもあるので、自分達が使っているライブラリの確認も同時に行うようにしましょう。

Configuration cacheの仕組み

Configuration cacheを有効にしても、最初のビルドではConfiguration phaseを実行するようになっています。
Configuration cacheが有効な場合、何か特定のGradleタスクを実行した際にGradleは要求されたタスクのセットに対してConfiguration cacheを利用することができるかどうかのチェックを行います。もし、Configuration cacheを利用できる場合は、Configuration phaseの実行をスキップします。
Configuration phaseが終わったあとは、タスクグラフのスナップショットをConfiguration cacheに新しく更新します。
詳しくは以下を参照してください。
https://docs.gradle.org/current/userguide/build_lifecycle.html

参考

https://docs.gradle.org/current/userguide/configuration_cache.html
https://medium.com/androiddevelopers/configuration-caching-deep-dive-bcb304698070

Discussion