[英]What is the correct way to set Android applicationId when using flavor dimensions?
我在我的项目中使用了风味维度,并且我一直在使用 for 循环将 applicationId 设置为我生成的风味:
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 - 这是正确的方法吗? android 插件不支持使用flavorDimensions 配置applicationId 的方法?
2 - 我在这里提到的配置在大多数情况下都适用,除非您使用的 google-services.json 已经在内部定义了应用程序包。 对于简单的 productFlavor 使用,配置工作正常,但是如果我使用风味维度,gradle 总是在抱怨:
:app:processUserBrandaDebugGoogleServices
No matching client found for package name 'com.mycompany.product'
基本上,'com.mycompany.product' 是在 AndroidManifest.xml 中默认定义的包。 如果我查看
app/build/intermediates/manifests/full/userBranda/debug/AndroidManifest.xml
我可以看到包被成功替换了。
我可以得出的结论是,仅对于风味维度,gradle 以某种方式仅在 processUserBrandaDebugGoogleServices 之后合并清单,这意味着此时清单中定义的包仍然是默认的。
这里有人有同样的问题吗? 如何解决此问题? 这是一个android gradle插件错误吗?
简而言之,关键字是applicationIdSuffix
,如下所示:
productFlavors {
pro {
applicationIdSuffix = ".pro"
}
free {
applicationIdSuffix = ".free"
}
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
功能更强大,您可以这样做:
applicationVariants.all { variant ->
def flavorData = rootProject.ext[variant.buildType.name]
variant.mergedFlavor.setApplicationId(flavorData.applicationId)
//do other things
}
我也遇到了这个问题。 有效的解决方案是在android{}
groovy 代码块之后编写apply plugin: 'com.google.gms.google-services'
以确保在执行插件代码时,已经设置了正确的applicationId
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.