◉GEMINI LABEN
●OMNI 1.2 — Gemini Omni 1.2 Flash が GA になりました(11/5)。最長15秒の動画生成と会話での編集に対応し、1.1 Flash は 12/3 に自動で 1.2 へ振り替わります●COMPUTER — Computer Use が Interactions / GenerateContent API で GA になりました(10/30)●LIVE — Live と TTS のプレビュー版は最短 11/17 に停止します(残り10日)。移行先は gemini-3.8-live と 3.8 系 TTS です●CLI — Gemini API CLI(gemini-api)がベータで登場(10/27)。エージェントやCI向けのゼロ依存クライアントです●2.5 PRO — gemini-2.5-pro と 2.5-flash は 12/1 から自動で振り替えられます(残り24日)。移行先は 3.8 Flash と 3.5 Flash-Lite です●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●OMNI 1.2 — Gemini Omni 1.2 Flash が GA になりました(11/5)。最長15秒の動画生成と会話での編集に対応し、1.1 Flash は 12/3 に自動で 1.2 へ振り替わります●COMPUTER — Computer Use が Interactions / GenerateContent API で GA になりました(10/30)●LIVE — Live と TTS のプレビュー版は最短 11/17 に停止します(残り10日)。移行先は gemini-3.8-live と 3.8 系 TTS です●CLI — Gemini API CLI(gemini-api)がベータで登場(10/27)。エージェントやCI向けのゼロ依存クライアントです●2.5 PRO — gemini-2.5-pro と 2.5-flash は 12/1 から自動で振り替えられます(残り24日)。移行先は 3.8 Flash と 3.5 Flash-Lite です●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/開発ツール
⟐ 開発ツール/2026-11-07初級

ビルドが「リソース重複」で止まった朝、原因は Dropbox の競合コピーでした

同期フォルダの中でビルドを回したら、生成物に競合コピーが80個以上できて Android のビルドが止まりました。原因の見つけ方と、build と .gradle を同期から外す手順、エージェントにビルドを任せる前の置き場所の決め方をまとめます。

gemini-cli10dropboxandroid9個人開発122トラブルシューティング42

Android アプリのビルドを走らせたところ、見覚えのないエラーで止まりました。「リソースが重複している」という趣旨のメッセージです。リソースを足した覚えはありません。前の晩に動いていたプロジェクトが、朝になって一行も触っていないのに通らなくなっていました。

エラーの出ているパスを辿ると、build フォルダの中に同じ名前のファイルが何十個も並んでいました。名前の末尾に「競合コピー」と付いたものです。数えてみると80個を超えていました。

個人開発のプロジェクトを Dropbox の下に置いている方は、同じ朝を迎える可能性があります。私自身がそうでした。

先に結論として、原因は「毎回作り直されるファイル」と同期の相性でした

最初にお伝えしたいのは、コードのバグではなかったということです。

ビルドのたびに作り直されるファイルが、クラッシュ解析のプラグインにありました。ビルドが走るたびに同じパスへ書き込み直すタイプのファイルです。それを Dropbox が掴んで同期しようとし、書き込みと同期がぶつかるたびに「競合コピー」という別ファイルを残していきました。

Gradle はそのコピーも全部リソースとして拾います。同じ ID のリソースが複数見つかり、「重複」で止まります。流れとしては、これだけのことでした。

芳しくない点は、エラーメッセージがどこにも「Dropbox」と言ってくれないことです。重複と言われれば、まず自分のコードを疑います。私も最初の30分は、直近で足した画像リソースを一つずつ外していました。

切り分けは、ファイル名を数えるところから始めます

原因を疑う順番は、次の3つにしています。

  1. エラーに出ているパスの親フォルダを開き、同じ名前のファイルが複数ないかを見ます
  2. 名前に「conflicted copy」や「競合コピー」が入っていないかを検索します
  3. 入っていたら、そのフォルダが同期の対象かどうかを確かめます

2番目はターミナルなら一行で済みます。

# プロジェクト直下で、競合コピーの数を数える
# 英語環境では "conflicted copy"、日本語環境では "競合コピー" が名前に入ります
find . \( -name "*conflicted copy*" -o -name "*競合コピー*" \) | wc -l

私の場合は80を超えていました。数が一桁なら偶然の衝突かもしれませんが、二桁なら仕組みの問題です。

直した手順は、掃除してから同期から外すだけでした

順番を間違えると、掃除した端から復活します。同期から外すのが先、掃除が後です。

まず build と .gradle を同期の対象外にします。Dropbox の公式ヘルプには、ファイルやフォルダを無視する方法が載っています。macOS で Apple の File Provider 方式を使っている場合は、次のコマンドです。

# build フォルダを Dropbox の同期から外す(File Provider 方式の macOS)
xattr -w 'com.apple.fileprovider.ignore#P' 1 "$HOME/Library/CloudStorage/Dropbox/Projects/MyApp/app/build"
xattr -w 'com.apple.fileprovider.ignore#P' 1 "$HOME/Library/CloudStorage/Dropbox/Projects/MyApp/.gradle"

File Provider を使っていない従来の方式では com.dropbox.ignored という属性を使います。Windows と Linux のコマンドも含め、正確な書き方は公式ヘルプの「How to set a file or folder to be ignored」でご確認ください。自分の環境がどちらの方式かで、使う属性が変わるのです。

ここで一つ、知っておいていただきたい注意があります。無視に設定したフォルダは、手元のディスクには残りますが、Dropbox のサーバーと他の端末からは削除されます。build のように作り直せるものなら問題ありません。ですが、同じ操作を「消えると困るフォルダ」にしてしまうと、他の端末から見えなくなります。対象は生成物だけに絞ってください。

そのうえで、競合コピーを消します。

# 先に一覧を目で確認してから、消します
find . \( -name "*conflicted copy*" -o -name "*競合コピー*" \) -print
# 内容に問題がなければ -delete を付けて再実行します
find . \( -name "*conflicted copy*" -o -name "*競合コピー*" \) -delete

-print で見てから -delete に進む二段構えにしているのは、パターンが広すぎて正規のファイルを巻き込む事故を避けるためです。

最後に ./gradlew clean を実行して、ビルドを通し直しました。以降、同じ朝は来ていません。

ほかの生成物のフォルダも、同じ目で棚卸しします

build と .gradle だけが特別だったわけではありません。ビルドやパッケージ管理のたびに中身が入れ替わるフォルダは、どれも同じ性質を持っています。たとえば Web の個人開発なら node_modules や .next、iOS なら DerivedData が候補です。

私は、プロジェクトを開いたら最初に「このフォルダは、消しても一コマンドで作り直せるか」を一つずつ自分に聞くようにしています。作り直せるなら同期に載せる理由がなく、載せれば競合コピーの種になります。逆に、作り直せないものが同期の外にあると、今度は端末の故障で失います。この問いの答えを、フォルダごとにメモへ書き出しておくと、迷う時間がほとんどなくなります。

エージェントにビルドを任せる前に、置き場所を決めておきます

ここからは、この失敗から引いた線引きの話です。

Gemini CLI のようなコーディングエージェントに作業を任せると、ビルドやテストの実行回数が、自分で手を動かすときより確実に増えます。生成物が毎回作り直される現場で、同期フォルダがその全部を追いかける——この組み合わせは、事故が起きる回数そのものを増やします。これは私が実際に試して確かめた話ではなく、仕組みから考えた見立てです。ただ、一度競合コピーの山を見た身としては、先に手を打っておきたい種類のリスクです。

エージェントの使い方そのものについては、Gemini CLI の導入ガイドとエラー対処ガイドにまとめています。ここでは置き場所だけを決めます。

私が決めた線引きは次の二つです。

  • 同期の対象はソースと設定です。ビルド生成物は同期しません
  • 同期フォルダの中でビルドする場合は、生成物のフォルダを先に無視へ設定してから回します

消えて困る物は同期、作り直せる物は同期の外。 締め切りの前夜に急いでいるときほど、この一文に立ち返るようにしています。

次にやること

まずは、いま使っているプロジェクトのフォルダで、競合コピーを数える一行だけ実行していただければと思います。0件なら、そのまま安心して使えます。1件でも出たら、build を同期から外すところから始めてください。私もそこから始めました。

シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

⟐ 開発ツール2026-10-24
MCP を足すほど 400 エラーに近づく — Gemini CLI のツール数を、タスクごとの持ち物に絞る
MCP サーバーを足していったら Gemini CLI が 400 で止まる、という報告が出ています。上限の数字は確定していませんが、includeTools でタスクごとに持ち物を決めておけば、原因の切り分けも予防もできます。
⟐ 開発ツール2026-10-20
@config と打ったのに別のファイルが渡っていた? Gemini CLI の @ 参照が曖昧一致を黙って拾う件の確かめ方
Gemini CLI の @ 参照で、名前が曖昧なときに最初の一致だけが使われるという報告を読み、同名ファイルが複数ある場所で事故を防ぐために行った点検の手順を、小さな Python スクリプトと一緒に整理しました。
⟐ 開発ツール2026-10-17
止まるときは静かに止まる — 定期実行の Gemini 呼び出しに、タイムアウト・空出力・多重起動の殻をかぶせる
cron などで `gemini -p` を呼ぶ定期実行が、応答待ちで止まる・終了コード 0 で空を返す・前回分と重なる、の 3 つから身を守る外側のシェルスクリプトです。替え玉コマンドで測った終了コードと所要秒数、タイムアウトが子プロセスをどこまで止めるかも載せました。