android - 声明 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
会反映在构建/部署中。
--
我试图解决这个问题:
- 如果 APK 未更改,则关闭并行运行/跳过安装。
- 清理和/或重建
- 删除 .gradle 文件夹
- 无效的缓存/重新启动
这些都不能始终如一地解决问题。为了解决它,我必须更改构建变体,希望它有效,如果不重复尝试上述方法,直到我在构建后真正看到更改。这至少可以说是非常辛苦的。
通过删除res.srcDirs = ['src/main/res', 'src/nonproduction/res']
问题立即解决,我的所有更改立即生效,但随后我失去了源集的价值。
有趣的是,即使只是指定res.srcDirs = ['src/main/res']
也足以对我造成这个问题。我不必声明任何自定义资源目录,以便在构建/部署期间始终识别我的资源更改。
由于我无法共享整个项目,因此我创建了一个示例应用程序,该应用程序可以为我最小限度地重现该问题。
https://github.com/scb5304/resourcechangetest
这是源集的已知缺点还是我的配置有问题?感谢这里的任何指导。
解决方案
推荐阅读
- java - Apache POI:一个单元格中不允许有多个单元格注释
- avfoundation - iOS - 如何检查相机胶卷中的类似视频?
- hadoop - `hive.exec.max.dynamic.partitions` 和 `hive.exec.max.dynamic.partitions.pernode` 的区别
- java - 如何使用片段调用另一个xml列表视图下的android:onClick on xml按钮?
- python - pandas 将跨多列的值计数汇总到摘要数据框中
- html - 对齐 Angular ICON 和 HTML 文本
- sticky - 不使用高度参数的制表符粘性标题
- oracle - 在 Oracle SQL 中创建表时如何定义时间数据类型
- php - PHP gd库displsys黑屏带白框而不是图像
- python-3.x - 在 Python 单元测试中正确使用 assertRaises