GitHub Actions で Android の Gradle ビルドが遅い:Gradle のキャッシュ、ビルドキャッシュ、ヒープ、コア数
GitHub Actions の Android の Gradle ビルドが遅いのは、4 つの理由が重なっているからです。ジョブは毎回新しい VM なので、Gradle User Home(~/.gradle:依存ライブラリ、ラッパーの Gradle 本体、ローカルのビルドキャッシュ)は空から始まります。Gradle のビルドキャッシュは、org.gradle.caching=true にするまで無効です。Gradle のヒープは既定で 512 MB(-Xmx512m)で、Android のドキュメントは、ガベージコレクションがビルド時間の 15% を超えるなら 4〜8 GB に上げるよう勧めています。そしてプライベートリポジトリの ubuntu-latest は 2 CPU・メモリ 8 GB です。直すのはこの順です。gradle/actions/setup-gradle で Gradle User Home をキャッシュし、ビルドキャッシュと並列実行を有効にし、ヒープを上げ、最後にコアとメモリを増やします。最後の 2 つはマシンの問題です。~/.gradle をジョブのあともディスクに残すランナーなら、キャッシュの復元そのものも要りません。
Skipbox は、アカウント専用のマシンでジョブを動かします。Gradle User Home、JDK、Docker のレイヤーはジョブのあとも残ります。runs-on: skipbox の 1行を書き換えるだけで、月 6,000 円の定額、実行時間は無制限です。skipbox-8x16 なら 8 vCPU・メモリ 16 GB です。
1. Gradle User Home をキャッシュする
setup-gradle は、Gradle User Home のうち次のビルドに効く部分、つまりダウンロードした依存ライブラリ、ラッパーの Gradle 本体、ローカルのビルドキャッシュをキャッシュします。
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- uses: gradle/actions/setup-gradle@v6
- run: ./gradlew assembleDebug
どれだけ効くかは、ドキュメントにある 3 つの点で決まります。
- 書き込むのはデフォルトブランチだけ。 既定では、ほかのブランチとプルリクエストのジョブはキャッシュを読むだけで保存しません。長く続くブランチは、
mainが最後に保存したものを毎回復元します。 - 実行のたびに新しいエントリを書きます。 ジョブと OS ごとで、どれも GitHub のリポジトリごと 10 GB の枠を使います。
- 既定のキャッシュの仕組みは、公開リポジトリなら無料、プライベートリポジトリでは Free Preview です。
cache-provider: basicは MIT ライセンスです。
2. ビルドキャッシュと並列実行を有効にする
Gradle の性能のガイドから、gradle.properties に書きます。
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.configuration-cache=true
org.gradle.caching=true。 「既定では、Gradle はビルドキャッシュを使いません」。有効にすると、入力の変わっていないタスクはFROM-CACHEになります。CI のジョブをまたいで効かせるには、Gradle User Home のローカルのビルドキャッシュがジョブのあとも残るか、リモートのビルドキャッシュが要ります。org.gradle.parallel=trueで、別々のモジュールのタスクを同時に動かします。動かすためのコアが要ります。- 設定キャッシュは、ビルドスクリプトが変わっていなければ設定のフェーズを飛ばします。Android のビルド速度のガイドも勧めています。
Android のガイドは、作業を減らすプロジェクトの設定をさらに 2 つ挙げています。推移的でない R クラスと、どの依存ライブラリにも要らなくなった Jetifier を切ることです。
3. ビルドに合ったヒープを Gradle に渡す
Gradle の JVM の引数は、既定で -Xmx512m -XX:MaxMetaspaceSize=384m です(ビルド環境)。Android のガイドは、ガベージコレクションがビルド時間の 15% を超えるなら(Build Analyzer で見えます)ヒープを 4、6、8 GB に上げ、パラレル GC も試すよう勧めています。
org.gradle.jvmargs=-Xmx6g -XX:+UseParallelGC
プライベートリポジトリの ubuntu-latest では、6 GB のヒープはマシンの 8 GB の 4 分の 3 で、ビルドのほかのプロセスと OS もそこに入ります。マシンのメモリが尽きると Linux がビルドを止め、ジョブは exit code 137 で終わります。Skipbox の M の 16 GB なら余裕があります。
4. ビルドにコアを増やす
並列実行を有効にすると、Gradle は独立したモジュールのタスクを同時に動かします。プライベートリポジトリの ubuntu-latest は 2 CPU です(GitHub ホストランナー)。GitHub の大きいランナーならコアは増えますが、使えるのは GitHub Team と Enterprise Cloud の組織だけで、分課金です。8 コア・32 GB で 1分 $0.022 です。
CI でのデーモン
Gradle のガイドによれば、CI では「長く動き続けるエージェントにはデーモンが効くが、短命なものには効かないことがある」。GitHub ホストランナーのジョブは短命です。Skipbox のジョブも、デーモンにとっては短命です。ジョブのたびにプロセスをすべて止めるので、次のジョブは新しいデーモンで始まります。次に渡るのはディスクにあるものです。
GitHub のランナーで、それぞれの直し方にかかるもの
- setup-gradle のキャッシュは、ジョブの始まりのダウンロードと展開、そしてデフォルトブランチのジョブの終わりのアップロードです。プルリクエストが読むのは
mainが保存したもので、自分の前回の実行ではありません。 - リモートのビルドキャッシュは、もう 1 台のサーバーを動かすことで、ヒットのたびにネットワークを通ります。
- コアとメモリを増やすのは大きいランナーで、GitHub Team か Enterprise Cloud が要ります。
Skipbox は Gradle User Home を残す
プランごとに、アカウント専用のマシンが付き、ジョブのあとも残ります。
~/.gradle/cachesが残ります。 依存ライブラリ、変換結果、ローカルのビルドキャッシュです。org.gradle.caching=trueなら、入力の変わっていないタスクは次のジョブでFROM-CACHEになります。プルリクエストのジョブもです。- ラッパーの Gradle 本体は
~/.gradle/wrapperに残り、setup-javaで入れた JDK、Docker のイメージとレイヤーも残ります。 - setup-gradle は手を出しません。
~/.gradle/cachesが既にあれば、setup-gradle は既定でそれを上書きせず、ジョブのサマリーに「Caching for Gradle actions was disabled due to pre-existing Gradle User Home」と出ます。同じワークフローは GitHub のランナーでもそのまま動きます。 - イメージに Android SDK はありません。 GitHub の
ubuntu-latestには入っています。Skipbox では android-actions/setup-android を足してください。 - コアとメモリはラベルで選び、定額です。 実行時間は無制限です。
S で、キャッシュに使える容量は GitHub の 7倍以上。マシンの大きさは、ジョブのラベルで選びます。
| ラベル | マシン | プラン |
|---|---|---|
skipbox | 4 vCPU・メモリ 16 GB | S、月 6,000 円 |
skipbox-8x16 | 8 vCPU・メモリ 16 GB | M、月 12,000 円 |
skipbox-16x32 | 16 vCPU・メモリ 32 GB | L、月 23,000 円 |
月 20,000分なら、GitHub の 4 コアのランナーは 参考値:2026年11月10日の為替レート・1ドル=158.22円。米ドルの料金を、このレートで円に換算した概算です。で S は 6,000 円、8 コアのランナーは 参考値:2026年11月10日の為替レート・1ドル=158.22円。米ドルの料金を、このレートで円に換算した概算です。で M は 12,000 円です。GitHub の額は、GitHub Team に含まれる無料分を引いたあとの請求です。
移行は runs-on を 1行書き換えるだけ
jobs:
build:
runs-on: skipbox-8x16 # ubuntu-latest から書き換える
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- uses: android-actions/setup-android@v4
- uses: gradle/actions/setup-gradle@v6
- run: ./gradlew assembleDebug testDebugUnitTest
skipbox-8x16 はプラン M で動きます。トライアルで動くのは runs-on: skipbox です。
- Skipbox に GitHub でログインする
- Skipbox の GitHub アプリを入れて、使うリポジトリを選ぶ
runs-onを書き換えて push する
セキュリティ
- マシンはアカウントごとの専用です。ほかの会社のジョブと同じマシンで動くことはありません。
- ジョブが終わるたびに、ランナーの認証情報、プロセスとコンテナ、ホームディレクトリの認証情報のファイルを消します。「毎回クリーン」なら、ジョブごとに新しいマシンで動きます。
- 書き込み権限のない人のコード(フォークからのプルリクエストなど)は、使い捨ての VM で動きます。キャッシュは読めますが、書き換えられません。
くわしくはジョブの分離のしくみにあります。
Android のビルドで試す
カード不要で、7日間かジョブの合計 3,000分まで無料です。ビルドのジョブを runs-on: skipbox にして 2 回動かし、2 回目のタスクの結果(FROM-CACHE、UP-TO-DATE)を GitHub と並べてください。
よくある質問
GitHub Actions で Android の Gradle ビルドが遅いのはなぜ?
4 つの理由が重なっています。GitHub ホストランナーのジョブは新しい VM なので、Gradle User Home(~/.gradle:依存ライブラリ、ラッパーの Gradle 本体、変換結果、ローカルのビルドキャッシュ)は復元するステップがなければ空です。Gradle のビルドキャッシュは org.gradle.caching=true にするまで無効です。Gradle のヒープは既定で -Xmx512m で、Android のドキュメントはガベージコレクションがビルド時間の 15% を超えるなら 4、6、8 GB に上げるよう勧めています。そしてプライベートリポジトリの ubuntu-latest は 2 CPU・メモリ 8 GB です。この順に直します。
GitHub Actions で Gradle をキャッシュするには?
gradle/actions/setup-gradle を使います。Gradle User Home のうち効く部分、つまりダウンロードした依存ライブラリ、ラッパーの Gradle 本体、ローカルのビルドキャッシュをキャッシュします。既定では、キャッシュに書き込むのはデフォルトブランチのジョブだけで、ほかのブランチとプルリクエストは読むだけです。既定のキャッシュの仕組みは公開リポジトリなら無料、プライベートリポジトリでは Free Preview です。cache-provider: basic は MIT ライセンスです。どのエントリも、GitHub のリポジトリごと 10 GB の枠を使います。
CI で Gradle のビルドキャッシュを有効にするべき?
はい。Gradle の性能のガイドによれば、Gradle は既定ではビルドキャッシュを使いません。gradle.properties に org.gradle.caching=true を書くと、入力の変わっていないタスクは実行されず FROM-CACHE になります。ただし CI のジョブをまたいで効くのは、Gradle User Home のローカルのビルドキャッシュがジョブのあとも残るか、リモートのビルドキャッシュを用意したときだけです。
GitHub Actions のランナーで、Gradle にどのくらいメモリを渡せばいい?
Android のビルド速度のガイドは、ガベージコレクションがビルド時間の 15% を超えるなら org.gradle.jvmargs=-Xmx4g、6g、8g を、あわせてパラレル GC を勧めています。プライベートリポジトリの ubuntu-latest はメモリが全部で 8 GB で、ビルドのほかのプロセスと OS もそこに入るので、-Xmx6g では余裕がほとんどありません。Skipbox の skipbox-8x16 のようにメモリ 16 GB のランナーなら、6 GB や 8 GB のヒープが収まります。
Skipbox は Android のビルドで何を残す?
Gradle User Home です。~/.gradle/caches(依存ライブラリ、変換結果、ローカルのビルドキャッシュ)とラッパーの Gradle 本体、それに Docker のレイヤーと setup-java で入れた JDK が残ります。setup-gradle は既にある Gradle User Home をそのまま使います。Gradle のデーモンは残りません。ジョブのたびにプロセスをすべて止めるからです。イメージに Android SDK は入っていないので、android-actions/setup-android で入れます。
試すのにお金はかかる?
かかりません。カード不要で、7日間かジョブの合計 3,000分まで無料です。ビルドのジョブを runs-on: skipbox にして 2 回動かし、2 回目のタスクの結果(FROM-CACHE、UP-TO-DATE)と時間を GitHub と比べてください。
2026年11月13日 更新