我在我的项目中使用 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
可以看到包被替换成功了。
我可以得出的结论是,仅对于 flavor 维度,gradle 仅在 processUserBrandaDebugGoogleServices 之后才以某种方式合并 list ,这意味着此时, list 中定义的包仍然是默认包。
这里有人遇到同样的问题吗?如何解决这个问题?这是一个 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
}
关于java - 使用 flavor 维度时设置 Android applicationId 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33893955/