具体报错信息:Unable to locate resourceFile (xxxx/xxx/app/build/intermediates/merged-not-compiled-resources/xxx/release/drawable/abc_dialog_material_background.xml) in source-sets.

        以前遇到每次遇到这个问题都是通过 ./gradlew :app:clean 命令清理缓存重新打包后就没问题了,但是治标不治本,后面每次打包的时候偶尔还是会出现。为了从根本上解决这个问题,探索了导致这个问题的原因,并找到解决的办法。

原因:Gradle 资源文件丢失

疑问解答:为什么总是 abc_dialog_material_background.xml 报错?

这个现象并非巧合,而是由多模块并发构建Jetifier 转换共同导致的:

  1. 高频依赖:该文件属于 androidx.appcompat 库。在您的项目中,几乎所有的业务模块(如 :ui, :base, 以及几十个业务子模块)都直接或间接依赖了这个库。

  2. 资源竞争(Race Condition):您的配置中开启了 org.gradle.parallel=true(并行构建)。当多个模块同时尝试处理(Merge/Transform)同一个 appcompat 库的资源时,Gradle 的缓存机制可能出现锁竞争或状态更新不及时。

  3. Jetifier 转换:开启 android.enableJetifier=true 意味着构建系统需要实时将旧版支持库资源转换为 AndroidX 格式。这个中间产物文件(intermediates)在并发高压下,容易出现“一个任务正在写入/解压,另一个任务却以为它已经存在而去读取”的情况,从而导致“Unable to locate”错误。 简而言之,这个文件之所以“倒霉”,是因为它所在的库被引用次数最多,在并行构建中发生读写冲突的概率最高。

解决方案

为了彻底解决这种并发与缓存带来的不一致性,我们需要调整 gradle.properties 中的不稳定性配置。

修改内容

我们将修改 gradle.properties 文件:

  1. 关闭配置缓存 (org.gradle.configuration-cache=false):这是最核心的修复点。配置缓存对文件系统的即时变化非常敏感,在处理这种高并发生成的中间文件时容易失效。

  2. 关闭按需配置 (org.gradle.configureondemand=false):此功能在多模块复杂项目中容易导致依赖图构建不完整,增加“找不到文件”的风险。

  3. 清理重复配置:删除文件中重复定义的 org.gradle.parallel=true(保留一个即可,虽然并行构建是诱因,但为了构建速度,我们先尝试保留并行,仅通过关闭缓存功能来修复稳定性。如果后续仍有问题,再考虑关闭并行)。

修改完成后,需要手动执行一次 ./gradlew :app:clean 以彻底清除旧的损坏缓存。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐