在工程目錄下第一級的 gradle.properties 中新增 :
android.nonFinalResIds=false
然後Sync Now 重新gradle,就不會再報錯了。
1. Android 專案中,資原始檔(如 R.string
、R.layout
等)會在構建時生成對應的 R
類,包含每個資源的唯一 ID。過去,這些資源 ID 預設是 final
的。
-
android.nonFinalResIds=false
(舊行為)- 所有資源 ID 都會被標記為
final
,無法修改。 - 適合傳統的單模組專案,但在多模組化或動態資源載入中限制較多。
- 所有資源 ID 都會被標記為
-
android.nonFinalResIds=true
(新行為,預設) - 資源 ID 不再生成為
final
。 - 支援多模組和動態資源載入(如 R8 編譯最佳化和資源分離)。
2. 為什麼要設定 nonFinalResIds
?
將 nonFinalResIds
設定為 true
或 false
取決於你的專案需求:
true
(預設,推薦)
- 支援 Gradle 資源最佳化(如移除未使用資源)。
- 更好地支援多模組化開發(模組間的資源訪問)。
- 減小 APK 檔案大小並最佳化編譯時間。
false
(相容性模式)
- 如果你依賴舊式程式碼邏輯(如硬編碼的資源引用)或某些第三方庫需要
final
資源 ID,則可以設定為false
。 - 在這種模式下,所有資源 ID 都會被標記為
final
,確保它們是不可變的。