Gradle从4.1.3升级到4.2.1后构建出现resValues属性无法修改报错
resValues属性无法修改报错的原因与解决方案
报错产生原因
Gradle 4.2及配套的Android Gradle Plugin(AGP)4.2+版本新增了配置属性的不可变校验机制,resValues属性会在配置阶段完成后被自动标记为只读状态,禁止后续任何修改操作。
Gradle 4.1.3版本没有该校验规则,所以即使在配置阶段后修改resValues也不会触发报错,升级后如果存在配置时机错误的代码就会抛出The value for property 'resValues' cannot be changed any further异常。
绝大多数情况下该报错都是由于resValues的修改逻辑被放在了配置阶段之后的生命周期节点,比如afterEvaluate块的后半段、Task的执行逻辑内部,或者是未适配AGP 4.2+的第三方插件在配置完成后尝试修改该属性。
可行解决方案
- 调整配置时机:将所有
resValues的新增、修改逻辑移动到配置阶段的标准位置,也就是模块级build.gradle的android.defaultConfig块、对应产品风味的android.productFlavors块、对应构建类型的android.buildTypes块中,不要放在afterEvaluate、Task执行逻辑等配置完成后才会触发的代码块内。 - 调整afterEvaluate执行顺序:如果确实需要依赖动态计算的配置值、必须在
afterEvaluate中修改resValues,可以将这部分修改逻辑移动到afterEvaluate块的最前端,确保修改动作在AGP将resValues标记为只读之前完成。 - 升级第三方插件:如果报错是由第三方插件触发的,查找对应插件是否已经发布适配AGP 4.2+的更新版本,将插件升级到兼容版本即可。
- 临时回退版本:如果暂时没有时间调整配置逻辑,可以先将AGP版本回退到4.1.3,待修改完配置逻辑后再完成版本升级。
内容的提问来源于stack exchange,提问作者humazed
相关产品推荐
相关产品推荐

