在工程目录下第一级的 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
,确保它们是不可变的。