声明res.srcDirs导致Android Studio资源文件变更检测失效问题
问题根因
你的配置存在错误,核心是直接对res.srcDirs执行赋值操作,覆盖了AGP(Android Gradle插件)内置的默认资源路径配置。
AGP默认会自动将src/main/res、当前构建变体专属的res目录(如src/internalDevelopment/res)纳入资源集合,同时会对这些默认路径做专属的增量构建标记。你使用res.srcDirs = [xxx]的写法直接替换了默认的路径集合,会丢失AGP用于增量资源检测的专属标记,哪怕你手动把src/main/res写到配置列表里,也无法触发正常的变更监听逻辑,最终导致主资源目录的修改被构建流程跳过。而你自定义的src/nonproduction/res等目录是手动新增的,没有默认标记的冲突问题,所以变更可以正常识别。
修复方案
删除所有sourceSet中对res.srcDirs的赋值操作,改用追加的方式添加自定义资源目录即可,不需要手动声明src/main/res,AGP会自动引入该目录。
修正后的配置示例如下:
sourceSets { internalDevelopment { java.srcDir('src/internal/java') java.srcDir('src/nonproduction/java') // 追加自定义资源目录,不覆盖默认配置 res.srcDir 'src/nonproduction/res' } internalStaging { java.srcDir('src/internal/java') java.srcDir('src/nonproduction/java') res.srcDir 'src/nonproduction/res' } internalProduction { java.srcDir('src/internal/java') java.srcDir('src/production/java') res.srcDir 'src/production/res' } externalProduction { java.srcDir('src/external/java') java.srcDir('src/production/java') res.srcDir 'src/production/res' } }
如果需要明确指定多个自定义资源目录,也可以用+=写法:
res.srcDirs += ['src/xxx/res', 'src/yyy/res']
修改配置后重新同步Gradle即可恢复正常的资源变更检测逻辑,无需额外清理缓存或重建项目。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

