How to set different applicationId for each flavor combination using flavorDimensions?
I finally managed to solve this. I think the solution is elegant (although the actual code could most likely be written a lot nicer by someone with groovy knowledge).
Solution for setting a specific applicationId for each combined flavor:
flavorDimensions "price", "dataset"
productFlavors {
free { flavorDimension "price" }
paid { flavorDimension "price" }
dataset1 { flavorDimension "dataset" }
dataset2 { flavorDimension "dataset" }
}
android.variantFilter { variant ->
def flavorString = ""
def flavors = variant.getFlavors()
for (int i = 0; i < flavors.size(); i++) {
flavorString += flavors[i].name;
}
if(flavorString.equalsIgnoreCase("freeDataset1")) {
variant.getDefaultConfig().applicationId "com.beansys.freeappdataset1"
}
if(flavorString.equalsIgnoreCase("freeDataset2")) {
variant.getDefaultConfig().applicationId "com.beansys.freedataset2"
}
if(flavorString.equalsIgnoreCase("paidDataset1")) {
variant.getDefaultConfig().applicationId "com.beansys.dataset1paid"
}
if(flavorString.equalsIgnoreCase("paidDataset2")) {
variant.getDefaultConfig().applicationId "com.beansys.mypaiddataset2"
}
}
How to set different applicationId for each flavor combination using flavorDimensions when using Gradle Kotlin-DSL?
Google added the variants API with the Android Gradle Plugin 7.0.0. With it we can alter the applicationId
.
android {
flavorDimensions.addAll(listOf("price", "dataset"))
productFlavors {
create("free") { dimension = "price" }
create("pro") { dimension = "price" }
create("dataset1") { dimension = "dataset" }
create("dataset2") { dimension = "dataset" }
}
}
androidComponents {
onVariants { variant ->
val applicationId = when(variant.flavorName) {
"freeDataset1" -> "com.beansys.freeappdataset1"
"freeDataset2" -> "com.beansys.freedataset2"
"proDataset1" -> "com.beansys.dataset1paid"
"proDataset2" -> "com.beansys.mypaiddataset2"
else -> throw(IllegalStateException("Whats your flavor? ${variant.flavorName}!"))
}
variant.applicationId.set(applicationId)
}
}
Note that it is probably better to use a task to determine the applicationId
.
For more informations see the following resources:
- https://developer.android.com/studio/releases/gradle-plugin#variant-api-stable
- https://youtu.be/AZBW5StgF8o?t=240
Setting the applicationId in gradle for a combined product flavor
Use it
android.applicationVariants.all { variant ->
def mergedFlavor = variant.mergedFlavor
switch (variant.flavorName) {
case "freeUs":
mergedFlavor.setApplicationId("com.application.id.freeUs")
break
case "freeDe":
mergedFlavor.setApplicationId("com.application.id.freeDe")
break
}
}
Related Topics
Can You Launch the Native Camera App from an HTML 5 Web App
App Not Setup: This App Is Still in Development Mode
Official "Boost Library" Support for Android and iOS
Display Huge Images in Android
Android Navigation Architecture Component - Get Current Visible Fragment
How to Merge Call Programmatically While Other Call Is Running (Conference Call)
Encoding H.264 from Camera with Android Mediacodec
How to Compile C into an Executable Binary File and Run It in Android from Android Shell
Retrofit Uploading Multiple Images to a Single Key
Alarmmanager Android Every Day
Android: Create Circular Image with Picasso
What Is the Default Font Family in Android
Eclipse, Android, Scala Made Easy But Still Does Not Work
How to Replace Deprecated Android.Support.V4.App.Actionbardrawertoggle
Facebook Authentication Without Login Button