哪个优先,Gradle构建类型或风格?

时间:2015-02-26 14:34:09

标签: android gradle

假设我在两个级别都定义了一个常量:在构建类型中,我将其设置为" mybuild"我把它设置为" myflavor"。

例如在这里:

buildTypes {
    debug {
        resValue "string", "analytics_key", "XXX_SANDBOX_KEY_XXX"
    }
}

productFlavors {
    appA {
        resValue "string", "analytics_key", "XXX_KEY_FOR_A_XXX"
    }
    appB {
        resValue "string", "analytics_key", "XXX_KEY_FOR_A_XXX"
    }
}

我想将不同应用程序(即风味)的事件发送到我的分析平台中的不同帐户。但是,如果我正在调试,我想将它们全部发送到我的沙箱帐户。

最初的问题是:哪个优先?从我的测试中,我已经可以回答:构建类型中的那个。

然而,更有趣的是:这有保证吗?

(或者,有更好的方法吗?)

2 个答案:

答案 0 :(得分:7)

  

这有保证吗?

构建类型通常被认为比同级别(例如,相同模块)的产品风格更高优先级。引用the documentation

  

通常,构建类型配置是覆盖其他配置的覆盖。例如,Build Type的packageNameSuffix被附加到Product Flavor的packageName。

然而,清单合并相当复杂,需要its own set of docs

在您的情况下,您正在创建资源。在这种情况下,它应遵循相同的规则,就像您将这些值作为字符串资源放在相关的源集中一样:

  

所有资源(Android资源和资产)都使用覆盖优先级,其中构建类型会覆盖产品风味,后者会覆盖主要的源集。

如果resValue的行为与使用sourcesets的等效行为不同,我会认为这是一个错误。

答案 1 :(得分:1)

作为替代方法,您可以将资源放在buildType文件夹,productFlavour文件夹或buildVariant文件夹的source-folder中的string.xml文件中。

如果将它放在buildVariant文件夹中,如果认为将保证将使用此值。

src-Root
    |->main
    |->debugAppA <- resources in this combination will be given precedence.
    |   |->res
    |      |->values
    |         |-> strings.xml
    |-> debug
    |   |->res
    |      |->values
    |         |-> strings.xml
    |-> appA
    |   |->res
    |      |->values
    |         |-> strings.xml