R 文件 (R.java) 是 Android 資源索引的核心,自動生成於構建過程。當 R 文件丟失或無法生成時,整個專案會出現大量「找不到符號 R」紅字錯誤。本文記錄一個典型案例:XML 布局屬性值包含特殊字符導致 AAPT 編譯失敗,進而引發 R 文件生成中斷。
Build → Rebuild Project 後錯誤依然存在R.java 文件在 build/generated/source/r/ 下缺失<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="<500" /> <!-- 這裡直接寫了 "<" 字符 -->
R.java → Java 代碼引用 R.xxx 找不到符號| 字符 | 轉義實體 | 十進制實體 | 十六進制實體 |
|---|---|---|---|
| < (小於號) | < | < | < |
| > (大於號) | > | > | > |
| & (和號) | & | & | & |
| " (雙引號) | " | " | " |
| ' (單引號) | ' | ' | ' |
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="<500" /> <!-- 正確轉義 -->
res/layout/、res/menu/、res/values/ 下 XMLandroid:text、android:hint、android:contentDescription 等文本屬性Build → Clean Project
Build → Rebuild Project
// 或命令列
./gradlew clean build
Build 面板 Gradle Console 或 Build Output,搜索 AAPT、error:、unexpected tokenFile → Invalidate Caches / Restart → Invalidate and Restart[a-z0-9_.],不能大寫、中文、特殊符號、以數字開頭app_name),需配置 resourcePrefix| 原因 | 特徵 | 解決 |
|---|---|---|
| XML 語法錯誤 (標籤未閉合、屬性值未加引號) | AAPT 明確報行號錯誤 | 修正 XML 語法 |
| 資源文件名非法 (大寫、中文、空格、特殊符號) | 報錯 "Invalid file name" | 重命名為小寫下劃線 |
| 9.png 圖片格式錯誤 | 報錯 "ERROR: 9-patch image malformed" | 用官方工具重新生成 .9.png |
| 依賴庫版本衝突導致資源合併失敗 | 多模組專案常見 | 統一版本、配置 resourcePrefix |
| manifest 合併衝突 | Manifest merger failed | 檢查 AndroidManifest.xml 合併規則 |
| 磁盤空間不足/構建目錄權限問題 | 臨時文件寫入失敗 | 清理空間、檢查權限 |
res/values/strings.xml,布局引用 @string/xxx,避免硬編碼轉義問題build.gradle 配置 lintOptions { abortOnError true },CI 流程中強制檢查Alt+Enter → "Escape HTML characters"核心心法:R 文件丟失 90% 是資源編譯階段失敗導致。遇到 R 錯誤,第一時間看 Gradle 輸出的 AAPT 錯誤,而非盯著 Java 代碼。XML 特殊字符轉義是最隱蔽也最常見的坑,養成「文本進 strings.xml」習慣可徹底避免。
記住:Clean Project → Rebuild Project → Invalidate Caches/Restart 是 Android 開發「三大金剛」,解決 80% 的疑難雜癥。