使用 Gradle Kotlin-DSL 时如何使用 flavorDimensions 为每个风味组合设置不同的 applicationId?
How to set different applicationId for each flavor combination using flavorDimensions when using Gradle Kotlin-DSL?
我正在使用 Kotlinscript 文件将 Android 应用程序转换为 Gradle Kotlin-DSL。
我在转换我们的 applicationId
逻辑时遇到问题。我们不使用 defaultConfiguration
和 applicationId
加上各种 applicationIdSuffix
作为我们的风格,而是使用自定义逻辑。逻辑在this SO answer中描述,这里是groovy代码:
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
}
}
使用 kotlin,我无法像 groovy 中那样更改 mergedFlavor
的 applicationId
。这是一个 val,因此无法更改。
有什么优雅的解决方案可以解决这个问题吗?
// 更新:现在有一种简单的方法可以做到这一点。看我的 .
//原答案:
诀窍是将 mergedFlavor
转换为 MergedFlavor
,然后为其更改 applicationId
:
import com.android.build.gradle.internal.core.MergedFlavor
android {
flavorDimensions("price", "dataset")
productFlavors {
create("free") { dimension = "price" }
create("pro") { dimension = "price" }
create("dataset1") { dimension = "dataset" }
create("dataset2") { dimension = "dataset" }
}
android.applicationVariants.all {
val applicationId = when(name) {
"freeDataset1" -> "com.beansys.freeappdataset1"
"freeDataset2" -> "com.beansys.freedataset2"
"proDataset1" -> "com.beansys.dataset1paid"
"proDataset2" -> "com.beansys.mypaiddataset2"
else -> throw(IllegalStateException("Whats your flavor? $name!"))
}
(mergedFlavor as MergedFlavor).applicationId = applicationId
}
}
感谢任何更清洁的解决方案!
//历史:
最初这个答案包含对 DefaultProductFlavor
的强制转换,自从 Android Gradle 插件 4.0.0 和现在的 AbstractProductFlavor
强制转换已弃用。
添加到 和 Mark 关于 AbstractProductFlavor
已被弃用的评论,您可以改为转换为 MergedFlavor
:
(mergedFlavor as com.android.build.gradle.internal.core.MergedFlavor).applicationId = applicationId
已使用 Android Gradle 插件 4.1.2 进行测试,但我想它自 4.0.0
起有效
Google 使用 Android Gradle 插件 7.0.0 添加了变体 API。有了它我们可以改变 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)
}
}
请注意,最好使用任务来确定 applicationId
。
有关详细信息,请参阅以下资源:
我正在使用 Kotlinscript 文件将 Android 应用程序转换为 Gradle Kotlin-DSL。
我在转换我们的 applicationId
逻辑时遇到问题。我们不使用 defaultConfiguration
和 applicationId
加上各种 applicationIdSuffix
作为我们的风格,而是使用自定义逻辑。逻辑在this SO answer中描述,这里是groovy代码:
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
}
}
使用 kotlin,我无法像 groovy 中那样更改 mergedFlavor
的 applicationId
。这是一个 val,因此无法更改。
有什么优雅的解决方案可以解决这个问题吗?
// 更新:现在有一种简单的方法可以做到这一点。看我的
//原答案:
诀窍是将 mergedFlavor
转换为 MergedFlavor
,然后为其更改 applicationId
:
import com.android.build.gradle.internal.core.MergedFlavor
android {
flavorDimensions("price", "dataset")
productFlavors {
create("free") { dimension = "price" }
create("pro") { dimension = "price" }
create("dataset1") { dimension = "dataset" }
create("dataset2") { dimension = "dataset" }
}
android.applicationVariants.all {
val applicationId = when(name) {
"freeDataset1" -> "com.beansys.freeappdataset1"
"freeDataset2" -> "com.beansys.freedataset2"
"proDataset1" -> "com.beansys.dataset1paid"
"proDataset2" -> "com.beansys.mypaiddataset2"
else -> throw(IllegalStateException("Whats your flavor? $name!"))
}
(mergedFlavor as MergedFlavor).applicationId = applicationId
}
}
感谢任何更清洁的解决方案!
//历史:
最初这个答案包含对 DefaultProductFlavor
的强制转换,自从 Android Gradle 插件 4.0.0 和现在的 AbstractProductFlavor
强制转换已弃用。
添加到 AbstractProductFlavor
已被弃用的评论,您可以改为转换为 MergedFlavor
:
(mergedFlavor as com.android.build.gradle.internal.core.MergedFlavor).applicationId = applicationId
已使用 Android Gradle 插件 4.1.2 进行测试,但我想它自 4.0.0
起有效Google 使用 Android Gradle 插件 7.0.0 添加了变体 API。有了它我们可以改变 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)
}
}
请注意,最好使用任务来确定 applicationId
。
有关详细信息,请参阅以下资源: