使用 Gradle Kotlin-DSL 时,如何使用flavorDimensions为每种风味组合设置不同的applicationId?

Hen*_*ing 6 android gradle gradle-kotlin-dsl

我正在使用 Kotlinscript 文件将 Android 应用程序转换为 Gradle Kotlin-DSL。

我在转换逻辑时遇到问题applicationId。我们不使用defaultConfigurationwith applicationIdplus 各种applicationIdSuffix口味来表达我们的口味,而是使用自定义逻辑。这个逻辑在这个 SO 答案中进行了描述,下面是常规代码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

对于 kotlin,我无法改变groovy 中的类似applicationId内容。mergedFlavor它是一个 val,因此无法更改。

有什么优雅的解决方案可以解决这个问题吗?

Hen*_*ing 12

Google 通过 Android Gradle Plugin 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,最好使用任务来确定applicationId.

有关更多信息,请参阅以下资源: