使用Gradle配置跨项目依赖时Android同步报错求助
问题根源及修复方案
1. 产物声明未关联任务或类型错误
生产者侧如果仅将目录路径添加到prepAssets配置,未把自定义任务myTask的输出绑定为配置产物,Gradle无法追踪该目录的生成来源,导致配置解析阶段找不到有效产物。
正确的生产者配置示例:
// 生产者模块build.gradle configurations { prepAssets { canBeResolved = false canBeConsumed = true attributes { attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, "android-assets")) attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.DOCUMENTATION)) } } } tasks.register("myTask") { // 明确声明任务输出目录 def outputDir = layout.buildDirectory.dir("generated/assets/myTask") outputs.dir(outputDir) doLast { // 生成assets的具体逻辑 outputDir.get().asFile.mkdirs() // ... } } // 将myTask的输出关联到prepAssets配置 artifacts.add("prepAssets", tasks.myTask)
2. 消费者侧过早求值产物路径
若在配置阶段直接将assetsConsumer的产物目录添加到Android assets源,会导致Lint相关任务(如generateDebugLintModel)初始化时,试图访问尚未被任务赋值的outputDirectory属性,触发错误。
正确的消费者配置需使用延迟求值:
// 消费者app模块build.gradle configurations { assetsConsumer { canBeResolved = true canBeConsumed = false attributes { attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, "android-assets")) attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.DOCUMENTATION)) } dependencies { project(path: ':生产者模块名', configuration: 'prepAssets') } } } // 用provider延迟获取产物目录,避免配置阶段提前求值 android.sourceSets.main.assets.srcDirs += providers.provider { configurations.assetsConsumer.singleFile }
3. 配置属性不匹配
生产者与消费者的配置需通过属性匹配完成依赖解析,若两边的属性(如Usage、Category)不一致,Gradle无法找到匹配产物,同样会触发依赖解析错误。需确保prepAssets和assetsConsumer的属性完全一致。
内容的提问来源于stack exchange,提问作者DwayneDuane
相关产品推荐
相关产品推荐

