![](/img/trans.png)
[英]GoogleServices - How to set different applicationId for each flavor combination using flavorDimensions?
[英]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.