如何使用flavorDimensions为每个风味组合设置不同的applicationId?

时间:2014-10-24 12:07:20

标签: android gradle android-gradle android-build

我有和旧的Android应用程序,我正在尝试迁移到android gradle构建系统。该应用程序目前内置于多项目设置中,并作为四个不同的应用程序发布(包括两个不同的数据集和两个数据集的免费/付费版本)。我已经设法通过使用flavorDimensions(以前称为flavorGroups)来摆脱多项目设置,但我无法弄清楚如何为每种风味组合设置不同的applicationId。

由于应用程序版本已经发布,我需要保留与当前版本相同的应用程序。由于我的原始包命名是如何完成的,我不能简单地使用flavor-buildtype与“packageNameSuffix”的组合(如果它是未发布的应用程序,那将是一个很好的选择)。

https://stackoverflow.com/a/20956353/4177090正在回答如何使用不同的源文件夹进行风味组合,而不是如何(如果可能的话)为构建文件中的每个组合设置特定配置。

Gradle构建文件摘要:

flavorDimensions "price", "dataset"

productFlavors {
    free { flavorDimension "price" }
    paid { flavorDimension "price" }
    dataset1 { flavorDimension "dataset" }
    dataset2 { flavorDimension "dataset" }
}

我想在我的gradle构建文件中有类似下面的内容(注意我的命名是如何unlogic的,这就是为什么我不能使用packageNameSuffix):

freeDataset1 { applicationId "com.beansys.freeappdataset1" }
freeDataset2 { applicationId "com.beansys.freedataset2" }
paidDataset1 { applicationId "com.beansys.dataset1paid" }
paidDataset2 { applicationId "com.beansys.mypaiddataset2" }

3 个答案:

答案 0 :(得分:22)

Fredrik提出的解决方案在将Android Studio升级到1.0.2(以及gradle插件到1.0.0)之后停止了工作,所以我不得不添加以下更改,当前从gradle插件1.3.1开始:

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
    }
}

答案 1 :(得分:6)

我终于设法解决了这个问题。我认为解决方案很优雅(尽管实际的代码最有可能被知识渊博的人写得更好)。

为每种组合风格设置特定applicationId的解决方案:

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"
    }
}

答案 2 :(得分:0)

我在转换给gradle kotlin dsl的答案时遇到问题。我找到了一个解决方案,并在这里分享了它:https://stackoverflow.com/a/60103604/2793394