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 コマンドと領域の移動をシーケンス図で書いてみた


【Git】Obsidian を GitHub と連携する

Obsidian では、クラウド連携は有料ですが、

GitHub リポジトリと連携してバックアップ保存できるらしいです。

これを、

こうすることができる。

GitHub と連携しておけば、複数の端末からアクセスできますし。

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

 

🧑🏻‍💻 初期設定

Git のプラグインを入れるだけなんです。これが。

👉 「Obsidian Git」を導入してみた。|devlive

分かりづらかったのは、

「Vault」という Obsidian で利用するディレクトリに

きちんと

「Git のローカルリポジトリディレクトリを設定しておく」

ということ。

あとは、そのディレクトリを以下画面が表示されたときに Open するだけ。

 

🧑🏻‍💻 Git ローカルリポジトリの作成と設定

ざっくり3つある。

リモートリポジトリを clone する場合。


$ git clone git@github-superman:org1/project1.git /path/to/project1
$ cd /path/to/project1
$ git config user.email "[email protected]"
$ git config user.name  "Super Man"

すでに、リポジトリを設定している場合。
ssh 設定のあとに origin URL を変更する必要があります。


$ cd /path/to/project2
$ git remote set-url origin git@github-superman:org2/project2.git
$ git config user.email "[email protected]"
$ git config user.name  "Super Man"

ローカルからリポジトリを設定、PUSH する場合。


$ cd /path/to/project3
$ git init
$ git remote add origin git@github-superman:org3/project3.git
$ git config user.email "[email protected]"
$ git config user.name  "Super Man"
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin main

👉 Using multiple github accounts with ssh keys
👉 【Xcode】ローカルと GitHub のソース管理連携設定

 

🧑🏻‍💻 まとめ

- Git プラグインを利用する。
- Git は Obsidian の GUI 上から操作可能。
- git clone してそれを Obsidian で Open するのが簡単。

【参考】👉 GitHub + SSH で複数アカウント切替え


GitHub + SSH で複数アカウント切替え

Git HTTPS Credential Helper がややこしいので SSH に切り替える。

GitHub リポジトリを指す remote origin の変更が必要となりますので、ざっくり概要を見ておきます。


# HTTPS 利用していたとする
git remote -v
> origin https://github.com/OWNER/REPOSITORY.git (fetch)
> origin https://github.com/OWNER/REPOSITORY.git (push)

# SSH 形式の URL に変更
git remote set-url origin [email protected]:OWNER/REPOSITORY.git

# 確認
git remote -v
# Verify new remote URL
> origin [email protected]:OWNER/REPOSITORY.git (fetch)
> origin [email protected]:OWNER/REPOSITORY.git (push)

👉 リモートリポジトリを管理する - GitHub Docs

🧑🏻‍💻 手順

1. 鍵をPC側で作成。


❯ ssh-keygen -t ed25519 -C [email protected] -f ~/.ssh/id_ed25519_main

👉 新しい SSH キーを生成して ssh-agent に追加する - GitHub Docs

2. GitHub にログインして貼る。Authentication keys


❯ pbcopy < ~/.ssh/id_ed25519_main.pub

👉 SSH and GPG keys - GitHub

3. ~/.ssh/config を設定する。


❯ vi ~/.ssh/config

Host github-main
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_ed25519_main
  TCPKeepAlive yes
  IdentitiesOnly yes # need for multiple accounts

Host github-sub
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_ed25519_sub
  TCPKeepAlive yes
  IdentitiesOnly yes # need for multiple accounts

4. PC側プロジェクト内で remote origin を書き換える。


git@github-main:your-main/Sample.git


❯ git remote -v
origin https://github.com/your-main/Sample.git (fetch)
origin https://github.com/your-main/Sample.git (push)

❯ git remote set-url origin git@github-main:your-main/Sample.git

❯ git remote -v
origin git@github-main:your-main/Sample.git (fetch)
origin git@github-main:your-main/Sample.git  (push)

❯ cat .git/config
[remote "origin"]
url = git@github-main:your-main/Sample.git
fetch = +refs/heads/*:refs/remotes/origin/*

5. 接続を確認する。


❯ ssh -T git@github-main
Hi your-main! You've successfully authenticated, but GitHub does not provide shell access.

👉 [備忘] 複数Githubアカウントでssh接続設定(config)を使い分ける手順 #GitHub - Qiita

 

🧑🏻‍💻 まとめ

URL 記述部分は、ssh:// がついてるほうが意味が分かりやすい気がします。

その場合は ~/.ssh/config の port 22 の記述は不要のようですが、

現在 GitHub ではスキーマ部分消えています。

などとダラダラ書きましたが、以下読んでみるとよく分かります。

👉 Multiple GitHub Accounts & SSH Config - Stack Overflow
👉 Using multiple github accounts with ssh keys
👉 【Git】Obsidian を GitHub と連携する
👉 初心者向け Git コマンドと領域の移動をシーケンス図で書いてみた