我在项目中使用了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 - 这是正确的方法吗? android插件不支持使用flavorDimensions配置applicationId的方法吗?
2 - 我在此处提到的配置适用于大多数情况,例如,如果您使用的google-services.json已经在内部定义了应用程序包。对于简单的productFlavor用法,配置正常,但如果我使用flavor维度,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插件bug吗?
答案 0 :(得分:5)
简而言之,关键字为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
}