繁体   English   中英

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

[英]How to set different applicationId for each flavor combination using flavorDimensions?

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

由于应用程序版本已经发布,我需要保持与当前相同的 applicationid。 由于我的原始包命名是如何完成的,我不能简单地将风味-构建类型与“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 构建文件中有如下内容(注意我的命名是多么不合逻辑,这就是我不能使用 packageNameSuffix 的原因):

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

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

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

为每个组合风味设置特定 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"
    }
}

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

对于 AGP 7.0,您应该使用onVariants

androidComponents {
   onVariants(selector().all(), { variant ->
      switch (variant.name) {
         case "freeDataset1":
            variant.applicationId = "com.beansys.freeappdataset1"
            break
         case "freeDataset2":
            variant.setApplicationId = "com.beansys.freedataset2"
            break
         ...
         ...
         ...
      }
   })
}

您甚至可以传递您的自定义“选择器”并仅针对特定变体执行某些操作:

androidComponents {
   onVariants(selector().withName("paidDataset1"), { variant ->
      variant.applicationId = "com.beansys.dataset1paid"
   })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM