Android Studio: product flavor combination with more than two flavor dimensions (flavor groups)
You want to use same extra source directory for some flavors;
appleRedFree + appleRedPaid --> src/appleRed
pearRedFree + pearRedPaid --> src/pearRed
appleYellowFree + appleYellowPaid --> src/appleYellow
pearYellowFree + pearYellowPaid --> src/pearYellow
You can set sourceSet for your flavors:
android {
// Other stuff here
flavorDimensions "fruit", "color”, “version”
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
free {
dimension "version"
}
paid {
dimension “version”
}
}
sourceSets {
appleRedFree {
java.srcDirs = ['src/main/java', 'src/appleRed/java']
}
appleRedPaid {
java.srcDirs = ['src/main/java', 'src/appleRed/java']
}
appleYellowFree {
java.srcDirs = ['src/main/java', 'src/appleYellow/java']
}
appleYellowPaid {
java.srcDirs = ['src/main/java', 'src/appleYellow/java']
}
pearRedFree {
java.srcDirs = ['src/main/java', 'src/pearRed/java']
}
pearRedPaid {
java.srcDirs = ['src/main/java', 'src/pearRed/java']
}
pearYellowFree {
java.srcDirs = ['src/main/java', 'src/pearYellow/java']
}
pearYellowPaid {
java.srcDirs = ['src/main/java', 'src/pearYellow/java']
}
}
// Other stuff here
}
I have a little enhancement because I really don't like to copy/paste src sets :)
So you can do something like this:
android {
…
applicationVariants.all { variant ->
def flavors = variant.productFlavors
def fruit = flavors[0].name
def color = flavors[1].name
def version = flavors[2].name
def fruitColorSrcSet = fruit + color.capitalize()
def srcSet = fruitColorSrcSet + version.capitalize()
android.sourceSets."$srcSet".java.srcDirs += "src/$fruitColorSrcSet/java"
}
}
I haven't tested it but it's based on my current implementation with additionally variant.buildType.name
usage
Appendix - to set resource directory use
android.sourceSets."$srcSet".res.srcDirs = "src/$fruitColorSrcSet/res"