4

默认情况下,所有项目都有一个 debug 和 release buildType。然而,人们通常会希望从这些基本构建类型继承,以使其他构建类型具有微小的差异。正如我们所知,“initWith”函数允许我们这样做,这会导致所有 Gradle 配置被继承。问题是它似乎不适用于 Android 资源。

这种情况的用例是,如果您有各种工具的调试与发布密钥(即需要定义为字符串),并且您不想在多个不同的资源目录中复制/粘贴 strings.xml 文件。

例如,假设我有以下 buildTypes:

  • 发布
  • 调试
  • qa - 使用 initWith 调试

如果我再创建资源目录:

  • 调试/res/values/strings.xml
  • 发布/res/values/strings.xml

qa buildType 将无法访问调试 strings.xml。我需要复制粘贴strings.xml:

  • qa/res/values/strings.xml

当然,复制粘贴是一个非常糟糕的主意,因为每个副本都需要进行任何更改,迟早会出错。我尝试将“qa”更改为“qaDebug”和“debugQa”,但没有成功。我可以使用 productFlavors,但最终我会得到比我需要的更多不同的变体,其中许多没有任何意义。例如,要拥有一个仅共享两个基本调试和发布资源目录的 dev、qa 和生产构建,我需要定义如下内容:

  • 开发调试
  • 去释放
  • qa调试
  • qa发布
  • 产品调试
  • 产品释放

不仅命名是多余的,而且这些构建配置中有一半是未使用的。乘以我有几个其他继承的 buildTypes,而不是我在这个简化示例中提到的事实,你可以看到它很快就失控了。

另一种选择是将 API 密钥定义为 gradle 变量(我目前有),但使用标准方法总是更好,因为它最终会更整洁,团队的新开发人员可以更容易地找到东西。除了字符串之外,还有其他资源,例如 google-services.json 甚至 XML 文件,它们只能通过资源目录进行处理。

感谢大家的投入。

4

1 回答 1

3

您可以使用sourceSets为构建变体指定不同的源集。在您的情况下,它应该如下所示:

android {
   ...
   sourceSets {
        yourBuildVariant {
            res.srcDirs = ['app/src/debug/res']
        }
    }
}

现在你的BuildVariant res 文件夹是“app/src/debug/res”而不是“app/src/yourBuildVariant/res”。

要检查构建变体及其相关源集的列表,请在右侧的 Android Studio 中单击 Gradle -> app -> Tasks -> android,然后单击 sourceSets 两次。

是Android文档。

于 2020-02-11T10:36:49.213 回答