java当使用flavor维度时,设置Android applicationId的正确方法是什么?
我在项目中使用了flavor维度,并使用for循环将applicationId设置为我生成的flavor:
flavorDimensions "appname", "brand"
productFlavors {
user {
dimension "appname"
}
installer {
dimension "appname"
}
branda {
dimension "brand"
}
brandb {
dimension "brand"
}
brandc {
dimension "brand"
}
brandd {
dimension "brand"
}
}
我会过滤我现在不支持的内容:
variantFilter { variant ->
def names = variant.flavors*.name
if (names.contains("installer") && (names.contains("brandc") || names.contains("brancd")) ) {
variant.ignore = true
}
}
然后我根据味道名称更新applicationId:
applicationVariants.all { variant ->
def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName()
def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor();
switch (flavorString) {
/**
* user
*/
case "userBranda":
mergedFlavour.setApplicationId("com.mycompany.product.user.someName")
mergedFlavour.setVersionName("1.0.0")
break
case "userBrandb":
mergedFlavour.setApplicationId("com.mycompany.product.user.b")
mergedFlavour.setVersionName("2.0.0")
break
case "userBrandc":
mergedFlavour.setApplicationId("com.mycompany.product.user.otherName")
mergedFlavour.setVersionName("1.5.0")
break
case "userBrandd":
mergedFlavour.setApplicationId("com.mycompany.product.user.d")
mergedFlavour.setVersionName("1.0.1")
break
/**
* installer
*/
case "installerBranda":
mergedFlavour.setApplicationId("com.mycompany.product.installer.marketingName")
mergedFlavour.setVersionName("1.0.0")
break
case "installerBrandb":
mergedFlavour.setApplicationId("com.mycompany.product.installer.b")
mergedFlavour.setVersionName("1.0.0")
break
default:
throw new GradleException("flavor ${flavorString} is not supported, please configure it first...")
break
}
我有两个问题:
1这是正确的方法吗?安卓插件不支持使用flavorDimensions配置applicationId的方法
2-我在这里提到的配置在大多数情况下都有效,除非你使用的是谷歌服务。其中已经定义了应用程序包的json。对于简单的productFlavor使用,配置正常,但如果我使用flavor维度,gradle总是抱怨:
:app:processUserBrandaDebugGoogleServices
No matching client found for package name 'com.mycompany.product'
基本上是“com”。我的公司。product’是AndroidManifest中默认定义的包。xml。 如果我看看
app/build/intermediates/manifests/full/userBranda/debug/AndroidManifest.xml
我可以看出,这个方案已被成功取代
我可以得出的结论是,只有在味道维度上,gradle才会在ProcessUserBrandedeBugGoogleServices之后合并清单,这意味着此时,清单中定义的包仍然是默认包
有人有同样的问题吗?如何解决这个问题?这是安卓gradle插件漏洞吗
# 1 楼答案
简而言之,关键字是
applicationIdSuffix
,如下所示:更强大的是,你可以这样做:
# 2 楼答案
我也在努力解决这个问题。有效的解决方案是在
android{}
groovy代码块之后写入apply plugin: 'com.google.gms.google-services'
,以确保在执行插件代码时,已经设置了正确的applicationId