【问题标题】:Gradle: Android Studio BuildType Resource InheritanceGradle:Android Studio BuildType 资源继承
【发布时间】:2020-01-02 20:22:17
【问题描述】:

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

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

例如,假设我有以下 buildTypes:

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

如果我再创建资源目录:

  • debug/res/values/strings.xml
  • release/res/values/strings.xml

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

  • qa/res/values/strings.xml

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

  • 开发调试
  • debRelease
  • qaDebug
  • qaRelease
  • prodDebug
  • 产品发布

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

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

感谢大家的意见。

【问题讨论】:

    标签: android android-studio gradle android-resources android-build-type


    【解决方案1】:

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

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

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

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

    Here 是 Android 文档。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      相关资源
      最近更新 更多