AGP4.1+Gradle6.5运行插件报错:无法查询无可用值的属性
问题根因
该问题是AGP 4.1与Gradle 6.5版本组合下的已知惰性属性求值时机问题:
- Gradle 6.x的惰性属性机制要求,任务输出属性必须在对应任务执行完成后才能读取值,否则会抛出无值异常。本次报错就是配置阶段提前读取了还未执行的任务输出属性导致的。
- 你的
iLintCheck任务在配置阶段就尝试解析:business:product:card:debugRuntimeClasspath的全量依赖,此时packageDebugRenderscript、processDebugManifest等上游任务还未执行,它们的headersDir、manifestOutputFile属性均未完成赋值,触发报错。 - 远程调试时正常运行属于偶然现象:调试断点拖慢了配置阶段的执行节奏,刚好在属性被读取前,对应的上游任务已经完成了执行赋值,不代表逻辑本身没有问题。
解决方法
方案1:显式声明任务依赖(推荐)
给iLintCheck任务添加上游任务依赖,保证属性读取前所有依赖任务已经执行完成,在模块的build.gradle中添加如下配置即可:
tasks.named("iLintCheck") { dependsOn ":common:base:packageDebugRenderscript" dependsOn ":thirdpart:multitype:processDebugManifest" // 后续如果出现其他模块的同类报错,继续添加对应任务的依赖即可 }
方案2:调整属性读取时机
修改iLintCheck自定义插件的逻辑,把读取debugRuntimeClasspath的代码从配置阶段迁移到执行阶段,也就是放到doFirst闭包或者标注了@TaskAction的任务执行方法中,避免配置阶段提前对惰性属性求值。
方案3:版本升级(可选)
该类惰性属性求值时机的兼容性问题已经在AGP 7.0+、Gradle 7.0+的版本组合中被官方修复,如果项目允许版本升级,升级到对应版本也可以彻底解决该问题。
内容的提问来源于stack exchange,提问作者tangken333
相关产品推荐
相关产品推荐

