How to set different applicationId for each flavor combination using flavorDimensions when using Gradle Kotlin-DSL?
android, gradle, gradle-kotlin-dsl
Solution
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
Problem
I am converting an Android app to the Gradle Kotlin-DSL by using Kotlinscript files. I have a problem converting our `applicationId` logic. We don't use the `defaultConfiguration` with `applicationId` plus various `applicationIdSuffix` for our flavors but a custom logic. The logic is described in this SO answer, here is the groovy code: ``` flavorDimensions "price", "dataset" productFlavors { free { dimension "price" } paid { dimension "price" } dataset1 { dimension "dataset" } dataset2 { dimension "dataset" } } android.applicationVariants.all { variant -> def mergedFlavor = variant.mergedFlavor switch (variant.flavorName) { case "freeDataset1": mergedFlavor.setApplicationId("com.beansys.freeappdataset1") break case "freeDataset2": mergedFlavor.setApplicationId("com.beansys.freedataset2") break case "paidDataset1": mergedFlavor.setApplicationId("com.beansys.dataset1paid") break case "paidDataset2": mergedFlavor.setApplicationId("com.beansys.mypaiddataset2") break } } ``` With kotlin I cannot alter the `applicationId` of the `mergedFlavor` like in groovy. It is a val and therefore can't be changed. Any elegant solution to solve this?