我在我的项目中使用了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之后合并清单,这意味着此时清单中定义的包仍然是默认包.
解决方法
简而言之,关键字是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 }