I've got 2 flavors of an app that each have their own google maps (v1) key for debug and release (meaning 4 keys total). So I'd like to know if I can specify sourceSets based on the buildType and productFlavor. Essentially, I'm wondering how I can achieve something like this:
src
├── debug
│ └── flavor1
│ └── res
│ └── values
│ └── gmaps_key.xml
├── release
│ └──flavor1
│ └── res
│ └── values
│ └── gmaps_key.xml
Where gradle will use the src/<currentBuldType>/<currentProductFlavor>/*
as part of its sourceSet.
Essentially I want it so that if I run gradle assembleFlavor1Debug
it will include everything under src/main/*
, src/flavor1/*
, and src/debug/flavor1/*
.
My build.gradle is super simple:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.0'
}
}
apply plugin: 'android'
android {
compileSdkVersion 8
productFlavors {
flavor1 {
packageName 'com.flavor1'
}
flavor2 {
packageName 'com.flavor2'
}
}
}
Any thoughts? Or maybe a better approach to this?
Now you have three different flavors of the same application to change the build variant, Android Studio uses select Build > select Build Variant in the menu bar (or click Build Variants within the windows bar), then select a build variant from the menu.
There is no direct way to get the current flavor; the call getGradle().
Flavor dimensions are groupings of product flavors, and you can combine flavors from different dimensions.
Discussion. A build type determines how an app is packaged. By default, the Android plug-in for Gradle supports two different types of builds: debug and release . Both can be configured inside the buildTypes block inside of the module build file.
I happened to come back to this because of a comment on my answer and realized that this answer is superfluous (still better than the accepted one which is even more so). For each productFlavor and buildType, combination and individual source sets already exist. i.e. src/{buildType}
, src/{productFlavor}
and src/{productFlavor}{buildType}
are already available source folders.
So essentially, all that was needed for the OP was to put the resources in src/flavor1Debug
which is equivalent to the src/debug/flavor1
that the OP envisions.
OLD ANSWER:
I've done something similar with buildConfig
but hopefully it should work with sourceSets
.
Basically, you define the common stuff at the productFlavors
level in a variable and keep adding things as you move down.
productFlavors {
def common = 'src/main'
flavor1 {
def flavor = 'src/main/flavor1'
buildTypes {
debug {
sourceSets {
res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/debug'
}
}
release {
sourceSets {
res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/release'
}
}
}
}
I haven't tested this. I think you might need to use android.sourceSets
instead of just sourceSets
.
I've also needed to define separate resources for the productFlavors
so I used a separate statement late in the build file. Like so:
android.sourceSets.flavor1 {
res.srcDirs = ['flavor_resources/flavor1/res']
}
You should just be able to use android.sourceSets.flavor1.debug
instead if you need to.
Also note that according to the Android Gradle user guide, using srcDir
adds the directory to the default sources and srcDirs
replaces them.
For Google Maps API integration you can check my gradle sample code here : https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks
Basically do a little trick in android.applicationVariants.all
during the mergeResources
phase, and place the API key in strings.xml under different flaver/buildtype combination folder.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With