Gradle ビルドキャッシュや KSP キャッシュを消すとき Gradle デーモン止めないと意味がない件

Android 開発をしていると、Git 操作後や依存関係を変更したあとに KSP(Kotlin Symbol Processing)やビルドキャッシュの問題 に遭遇することがあります。


java.lang.IllegalStateException: Storage for [C:\...\symbolLookups\id-to-file.tab] is already registered

この記事では、Gradle デーモンとキャッシュの関係を整理し、「キャッシュを消したのにビルドが直らない」問題 を回避する方法を解説します。

 

🤔 Gradle デーモンとは何か

Gradle はビルドの高速化のために デーモン と呼ばれるバックグラウンドプロセスを使います。

常駐プロセスとして、次回のビルドでキャッシュを再利用

複数プロジェクトやターミナルで同時に動作可能

Android Studio 再起動だけでは停止しない場合がある

デーモン状態の確認方法


./gradlew --status


No Gradle daemons are running

→ デーモン未起動


PID STATUS INFO
3494 IDLE 8.11.1

→ デーモン起動済み、待機中


PID STATUS INFO
3494 BUSY 8.11.1

デーモン停止は以下で可能:


./gradlew --stop

 

🤔 キャッシュを消しても直らない理由

KSP や Gradle のキャッシュを削除しただけでは、既に動作中のデーモンが古いキャッシュ情報を保持している場合があります。

典型的なケース


1. git rebase でコミットを整理

2. KSP が参照する Room の型情報や生成コードが変更

3. Gradle デーモンが古いキャッシュを保持 → ビルド失敗

つまり、キャッシュを消しても、デーモンが古い情報を持っている限り意味がありません。

 

🤔 解決手順まとめ

① Gradle デーモンを止める


./gradlew --stop

すべての Gradle デーモンを終了

次回ビルド時に新しいデーモンが起動

② KSP キャッシュを削除する


rm -rf .ksp/ */build/kspCaches */build/generated/ksp/

KSP が持つ生成キャッシュを完全に削除

再ビルド時に最新のコードから生成される

③ Android Studio のキャッシュをクリア


File → Invalidate Caches / Restart → Invalidate and Restart

IDE 側のキャッシュもクリア

デーモン再起動時に正しい情報を読み込む

④ KSP のインクリメンタルコンパイルを無効化(必要に応じて)

gradle.properties に追加:


ksp.incremental=false

キャッシュ競合によるエラー(例:java.lang.IllegalStateException: Storage for [C:\...\symbolLookups\id-to-file.tab] is already registered)を回避

 

🤔 Git Rebase 後の KSP ビルドフロー


Git Rebase
    ↓
ソースコード変更
    ↓
KSP キャッシュ古いまま
    ↓ (Gradle デーモン生きている場合)
ビルド失敗 → Storage already registered など
    ↓
./gradlew --stop でデーモン停止
    ↓
KSP キャッシュ削除
    ↓
再ビルド
    ↓
成功

 

🤔 まとめ

Gradle デーモンは Android Studio 再起動だけでは必ずしも止まらない

KSP やビルドキャッシュを消すときは必ずデーモンを止める

典型的な手順:


./gradlew --stop

rm -rf .ksp/ */build/kspCaches */build/generated/ksp/

Android Studio キャッシュクリア

ビルド再実行

これで Git 操作後や依存関係変更後のビルド失敗を防げる

Gradle デーモンの挙動を理解しておくと、「キャッシュ消したのに直らない」問題 に悩まされずに済みます。

ビルド高速化の恩恵を受けつつ、必要なときにはデーモンを適切に制御しましょう。

android - java.lang.IllegalStateException: Storage for [C:\...\symbolLookups\id-to-file.tab] is already registered - Stack Overflow


初心者向け Git コマンドと領域の移動をシーケンス図で書いてみた

Git 公式リンクから確認しておきたい初心者機能を抽出して、操作の流れに合わせて状態の変化、確認方法をシーケンス図でまとめます。

👉 Git - Reference
👉 とほほのGit入門 - とほほのWWW入門

👉 Git の初心者がつまづく領域の名称
👉 GitHub + SSH で複数アカウント切替え


Git の初心者がつまづく領域の名称

なんでこんなに領域の名称があるのか。

歴史的な何かか、日本語の弊害か。

初心者新参者がつまずいたメモです。

 

🧑🏻‍💻 WORKSPACE


{ ワーキング | ワーク | 作業 } [ ツリー | ディレクトリ ]

- ワーキングツリー
- ワーキングディレクトリ
- ワークディレクトリ
- ワークツリー
- 作業ディレクトリ

 

🧑🏻‍💻 INDEX


{ インデックス | ステージ | ステージング } [ エリア | ディレクトリ ]

- インデックス
- ステージング
- ステージ
- ステージングエリア

 

🧑🏻‍💻 LOCAL REPOSITORY


ローカル [ リポジトリ | ブランチ ]

- ローカルリポジトリ
- ローカルブランチ

 

🧑🏻‍💻 UPSTREAM REPOSITORY


リモート [ リポジトリ | ブランチ ]

- リモートリポジトリ
- リモートブランチ

 

🧑🏻‍💻 まとめ

職場環境のポリシーや管理者によって変わったりするんだわ。

WEBで公開されている著名リファレンスやドキュメントでもいろいろ変わる。

狭い環境に依存することなく広く。

各コマンドによる状態変化遷移シーケンス図を次は作ってみたいです。

👉 初心者向け Git コマンドと領域の移動をシーケンス図で書いてみた