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・AndroidStudio・Git・GitHub・Gradle・KMP・Kotlin・おすすめ・ツール・開発