默认情况下,所有项目都有一个 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 文件,它们只能通过资源目录进行处理。
感谢大家的投入。