我正在我的应用程序中设置产品口味,并且遇到了一个问题。我的两种产品口味彼此非常相似,仅在一些资源上有所不同,我们将其称为FlavorA和FlavorB。我想对其进行设置,以使FlavorA是FlavorB的父级,这样FlavorB可以仅覆盖FlavorA的一些资源,然后FlavorA覆盖来自main的一堆资源。有没有办法建立这样的 flavor 层次?现在,我需要在两者之间复制大量资源,以使其正常工作,我想消除这种重复。
编辑:确定。到目前为止,我有几个答案(均已删除)都与我的问题无关,所以让我澄清一下。这与Java OOP无关,我已经很清楚了。 :)
我遇到的问题是我有一个免费/付费版本的应用程序,然后有几个仅包含主题更改的白色标签。付费版本仅更改了免费版本中的一些 Assets (代码更改除外)。这是我的productFlavors
的样子:
productFlavors {
whiteLabelA {
applicationId "com.whiteLabelA.android"
}
whiteLabelB {
applicationId "com.whiteLabelB.android"
}
mainFree {
applicationId "com.mainFree.android"
}
mainPaid {
applicationId "com.mainFree.android.paid"
}
}
我希望
mainPaid
覆盖mainFree
,因为它仅更改了一些资源。我想用这种方式而不是免费/付费构建类型,因为白色标签没有付费版本,而且具有如下 flavor 层次结构会更容易:mainPaid extends mainFree {
applicationId "com.mainFree.android.paid"
}
最佳答案
我发现了两种解决方案:
1.使用 flavor 尺寸。
android {
...
flavorDimensions 'palette', 'color'
productFlavors {
blackAndWhite {
dimension 'palette'
}
redAndWhite {
dimension 'palette'
}
red {
dimension 'color'
}
white {
dimension 'color'
}
}
variantFilter { variant ->
def first = variant.getFlavors().get(0).name
def second = variant.getFlavors().get(1).name
if(!(first.equals('blackAndWhite') && second.equals('white')) ||
!(first.equals('redAndWhite') && (second.equals('white') || second.equals('red')))) {
variant.setIgnore(true);
}
}
...
}
由于
variantFilter
,我们有3种组合,而不是4种:blackAndWhite => white
redAndWhite => white
=> red
您可以将其视为扩展
red
的redAndWhite
和扩展white
或blackAndWhite
的redAndWhite
。This answer和变体过滤器documentation很有帮助。
2.编辑源集。
productFlavors{
flavor1 {
}
flavor2 {
}
}
sourceSets {
flavor2 {
java.srcDirs = sourceSets.flavor1.java.srcDirs
res.srcDirs = sourceSets.flavor1.res.srcDirs
resources.srcDirs = sourceSets.flavor1.resources.srcDirs
aidl.srcDirs = sourceSets.flavor1.aidl.srcDirs
renderscript.srcDirs = sourceSets.flavor1.renderscript.srcDirs
assets.srcDirs = sourceSets.flavor1.assets.srcDirs
}
}
代码示例是从this blog post无耻复制的。非常感谢作者。