現象:將包含資源引用 (如 `R.id.xxx`) 的代碼跨項目復制粘貼、刪除、再粘貼回來,導致項目報錯 activity_main cannot be resolved or is not a field,Clean/重啟無效,唯有撤銷 (Ctrl+Z) 或重建項目可解決。
根因分析
- Eclipse ADT 的 **資源索引器 (AAPT) 增量編譯機制** 在處理跨項目剪貼板操作時,可能將**臨時的錯誤引用寫入索引緩存**,導致 R.java 生成邏輯混亂。
- 復制帶有 `R.id.xxx` 的代碼時,目標項目中可能不存在該資源 ID,索引器記錄了「缺失資源」狀態,即使後來刪除代碼、恢復正確資源,索引緩存未及時刷新,持續報錯。
- 此為 **Eclipse ADT 歷史已知 Bug**,Google 已停止維護 ADT (2015 年),無官方修復。
規避最佳實踐
- 避免跨項目復制含資源引用的代碼: 復制前將 `R.id.xxx` 替換為字符串常量或佔位符,粘貼後再手動修正。
- 發生錯誤立即撤銷 (Ctrl+Z): 緩存未持久化前撤銷可恢復索引一致性。
- 強制全量重建索引: 關閉 Eclipse → 刪除項目目錄下 `.apt_generated`、`bin`、`gen` 目錄 → 刪除工作空間 `.metadata/.plugins/org.eclipse.core.resources/.projects/` → 重啟 Eclipse → Project → Clean (勾選所有)。
- 遷移至 Android Studio (Gradle + AAPT2): **根治方案**。Gradle 構建系統獨立於 IDE,資源處理穩定可靠,不存在此類索引同步問題。
應急恢復腳本
# 項目根目錄執行
rm -rf .apt_generated bin gen
# Eclipse 關閉後
rm -rf workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/YourProject
# 重啟 Eclipse → Clean All
核心教訓:**舊工具鏈 (Eclipse ADT) 累積的架構性缺陷無法通過技巧根治,遷移至現代構建系統 (Gradle/AGP) 是唯一長效解法**。