首页 > 解决方案 > 声明 res.srcDirs 会破坏 Android Studio 对资源文件的更改检测

问题描述

我们的 Android 客户端中有多个构建变体。我们刚刚开始通过自定义源集跨构建变体共享源代码和资源。这就是他们的样子:

sourceSets {
    internalDevelopment {
        java.srcDir('src/internal/java')
        java.srcDir('src/nonproduction/java')
        res.srcDirs = ['src/main/res', 'src/nonproduction/res'] // < --
    }
    internalStaging {
        java.srcDir('src/internal/java')
        java.srcDir('src/nonproduction/java')
        res.srcDirs = ['src/main/res', 'src/nonproduction/res']
    }
    internalProduction {
        java.srcDir('src/internal/java')
        java.srcDir('src/production/java')
        res.srcDirs = ['src/main/res', 'src/production/res']
    }
    externalProduction {
        java.srcDir('src/external/java')
        java.srcDir('src/production/java')
        res.srcDirs = ['src/main/res', 'src/production/res']
    }
}

问题是,由于引入了这种模式,Android Studio 不尊重我们对以下文件所做的更改src/main/res

这意味着,我可以进入我的 Activity 的 XML 文件之一,更改用户显示的字符串,部署到我的设备,并且没有任何更改。Android Studio 可以毫无问题地显示我对 XML 所做更改的预览。我什至可以通过删除代码库引用的多个元素来完全使 XML 无效;它部署时没有任何警告或编译错误。

但是,对资源文件所做的更改src/nonproduction/res 反映在构建/部署中。

--

我试图解决这个问题:

  1. 如果 APK 未更改,则关闭并行运行/跳过安装。
  2. 清理和/或重建
  3. 删除 .gradle 文件夹
  4. 无效的缓存/重新启动

这些都不能始终如一地解决问题。为了解决它,我必须更改构建变体,希望它有效,如果不重复尝试上述方法,直到我在构建后真正看到更改。这至少可以说是非常辛苦的。

通过删除res.srcDirs = ['src/main/res', 'src/nonproduction/res']问题立即解决,我的所有更改立即生效,但随后我失去了源集的价值。

有趣的是,即使只是指定res.srcDirs = ['src/main/res']也足以对我造成这个问题。我不必声明任何自定义资源目录,以便在构建/部署期间始终识别我的资源更改。

由于我无法共享整个项目,因此我创建了一个示例应用程序,该应用程序可以为我最小限度地重现该问题。

https://github.com/scb5304/resourcechangetest

这是源集的已知缺点还是我的配置有问题?感谢这里的任何指导。

标签: androidgradlesource-setsandroid-sourcesets

解决方案


推荐阅读