Как установить разные applicationId для каждой комбинации вкусов с использованием flavourDimensions при использовании Gradle Kotlin -DSL? - PullRequest
0 голосов
/ 07 февраля 2020

Я конвертирую приложение Android в Gradle Kotlin -DSL, используя файлы Kotlinscript.

У меня проблема с преобразованием нашей applicationId logi c. Мы не используем defaultConfiguration с applicationId плюс различные applicationIdSuffix для наших вкусов, а персонализированные логи c. Лог c описан в этом SO-ответе , вот код 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 я не могу изменить applicationId mergedFlavor как в groovy. Это значение и поэтому не может быть изменено.

Любое элегантное решение, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 07 февраля 2020

Я получил помощь на канале Slack на этой проблеме и разрешение поделиться ею здесь:

Хитрость в том, чтобы привести mergedFlavor к DefaultProductFlavor и затем изменить applicationId для него. :

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 DefaultProductFlavor).applicationId = applicationId
}

Любое более чистое решение ценится!

...