Android Studio: product flavor combination with more than two flavor dimensions (flavor groups) Android Studio: product flavor combination with more than two flavor dimensions (flavor groups) android android

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"