# GitHub Actions で Android の Gradle ビルドが遅い：Gradle のキャッシュ、ビルドキャッシュ、ヒープ、コア数

> GitHub Actions で Android の Gradle ビルドが遅いのは、新しい VM で Gradle User Home が空から始まり、Gradle のビルドキャッシュは既定で無効、ヒープは既定で 512 MB、プライベートリポジトリの ubuntu-latest は 2 CPU だからです。Gradle と Android のドキュメントにある直し方を効く順に。~/.gradle をジョブのあとも残すマシンなら Skipbox、月 6,000 円から、実行時間は無制限です。

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 です。

- `~/.gradle` は専用のマシンに残る。依存ライブラリ、ラッパーの Gradle 本体、ローカルのビルドキャッシュが、どのブランチの次のジョブにもある
- 8 vCPU・メモリ 16 GB が月 12,000 円。プライベートの `ubuntu-latest` は 2 CPU・8 GB
- 4 vCPU で月 20,000分なら、GitHub は 約 35,120 円、Skipbox は 6,000 円

**GitHub Actions を月額固定・使い放題に** Skipbox は、アカウント専用のマシンで GitHub Actions のジョブを動かします。何分動かしても月 6,000 円。ジョブが終わっても Docker のレイヤーと依存パッケージのキャッシュが残るので、次のジョブはすぐ始まります。

4 vCPU のランナーを月 20,000分 使うと、GitHub 約 35,120 円 → Skipbox 6,000 円。毎月 約 29,120 円お得。

移行は `runs-on: skipbox` に 1行書き換えるだけです。

[7日間無料で試す](https://app.skipbox.dev/sign-in?ref=g-android-gradle-build-slow-github-actions-ja)

## 1. Gradle User Home をキャッシュする

[setup-gradle](https://github.com/gradle/actions/blob/main/docs/setup-gradle.md) は、Gradle User Home のうち次のビルドに効く部分、つまりダウンロードした依存ライブラリ、ラッパーの Gradle 本体、ローカルのビルドキャッシュをキャッシュします。

```yaml
- 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 の性能のガイド](https://docs.gradle.org/current/userguide/performance.html)から、`gradle.properties` に書きます。

```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 のビルド速度のガイド](https://developer.android.com/build/optimize-your-build?hl=ja)も勧めています。

Android のガイドは、作業を減らすプロジェクトの設定をさらに 2 つ挙げています。推移的でない R クラスと、どの依存ライブラリにも要らなくなった Jetifier を切ることです。

## 3. ビルドに合ったヒープを Gradle に渡す

Gradle の JVM の引数は、既定で `-Xmx512m -XX:MaxMetaspaceSize=384m` です（[ビルド環境](https://docs.gradle.org/current/userguide/build_environment.html)）。Android のガイドは、ガベージコレクションがビルド時間の 15% を超えるなら（Build Analyzer で見えます）ヒープを 4、6、8 GB に上げ、パラレル GC も試すよう勧めています。

```properties
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 ホストランナー](https://docs.github.com/ja/actions/reference/runners/github-hosted-runners)）。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](https://github.com/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 コアのランナーは 約 35,120 円で S は 6,000 円、8 コアのランナーは 約 66,770 円で M は 12,000 円です。GitHub の額は、GitHub Team に含まれる無料分を引いたあとの請求です。

## 移行は runs-on を 1行書き換えるだけ

```yaml
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` です。

1. Skipbox に GitHub でログインする
2. Skipbox の GitHub アプリを入れて、使うリポジトリを選ぶ
3. `runs-on` を書き換えて push する

## セキュリティ

- マシンはアカウントごとの専用です。ほかの会社のジョブと同じマシンで動くことはありません。
- ジョブが終わるたびに、ランナーの認証情報、プロセスとコンテナ、ホームディレクトリの認証情報のファイルを消します。「毎回クリーン」なら、ジョブごとに新しいマシンで動きます。
- 書き込み権限のない人のコード（フォークからのプルリクエストなど）は、使い捨ての VM で動きます。キャッシュは読めますが、書き換えられません。

くわしくは[ジョブの分離のしくみ](https://docs.skipbox.dev/ja/isolation)にあります。

## 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 更新 · https://skipbox.dev/ja/guides/android-gradle-build-slow-github-actions
