假设我在两个级别都定义了一个常量:在构建类型中,我将其设置为" 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"
}
}
我想将不同应用程序(即风味)的事件发送到我的分析平台中的不同帐户。但是,如果我正在调试,我想将它们全部发送到我的沙箱帐户。
最初的问题是:哪个优先?从我的测试中,我已经可以回答:构建类型中的那个。
然而,更有趣的是:这有保证吗?
(或者,有更好的方法吗?)
答案 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