我有一个相对复杂的项目,每个应用程序需要两个风味维度.我在下面的示例中更简单地重写了它:
flavorDimensions "shape", "color"
productFlavors {
blue {
flavorDimension "color"
}
red {
flavorDimension "color"
}
green {
flavorDimension "color"
}
square {
flavorDimension "shape"
}
circle {
flavorDimension "shape"
}
Run Code Online (Sandbox Code Playgroud)
我希望能够为每个变体设置不同的applicationId,例如:squareblue将具有与circleblue不同的applicationId.我无法在颜色维度中设置applicationId,因为它对于每个形状都是相同的.在上面的例子中我需要有6个不同的applicationIds.这些ID也不遵循任何模式,它们可以是任何东西.
我在这里看到了答案:如何使用flavorDimensions为每个风味组合设置不同的applicationId?但这意味着我需要手动设置,这对我的项目来说是不可行的,因为变种的数量(1000s).
我真正想要做的是在颜色维度上设置两个应用程序,然后在构建时根据形状维度选择正确的一个.我已经尝试过定义变量但是没有取得任何成功,它们只是被最后一个变量覆盖了.
我在我的项目中使用了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"
}
}
Run Code Online (Sandbox Code Playgroud)
我过滤那些我现在不支持的:
variantFilter { variant ->
def names = variant.flavors*.name
if (names.contains("installer") && (names.contains("brandc") || names.contains("brancd")) ) {
variant.ignore = true
}
}
Run Code Online (Sandbox Code Playgroud)
然后我根据flavor名称更新applicationId:
applicationVariants.all { variant ->
def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName()
def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor();
switch (flavorString) {
/**
* user
*/
case …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以为特定的风味组组合提供文件或配置设置.例如,我有2个风味组,每组有2种不同的风味:
风味组:版本
风味组:类型
订购"类型","版本"时,我可以构建我的应用程序的4种不同风格:
我的源代码树看起来像这样:
/src
/free
/res
/full
/res
/v2
/java
/res
AndroidManifest.xml (features and permissions for v2 flavors)
/v3
/java
/res
AndroidManifest.xml (features and permissions for v3 flavors)
Run Code Online (Sandbox Code Playgroud)
这正是我想要的,对我的项目非常有效.但是,我希望我能为特定的风味组合组合提供文件.例如,我想为FullV3和FullV2提供不同的AndroidManifests.我不认为这是可能的,或者?例如:
/src
/free
/res
/full
/res
/v2
/java
/res
AndroidManifest.xml (features and permissions for v2 flavors)
/v3
/java
/res
AndroidManifest.xml (features and permissions for v3 flavors)
/fullv3
AndroidManifest.xml (features and permissions for full v3 only!)
/fullv2
AndroidManifest.xml (features and permissions …Run Code Online (Sandbox Code Playgroud) 我有一个Gradle Android项目,使用此产品组和Flavors配置:
/*
* Define different flavor groups
*/
flavorGroups 'market', 'version'
/*
* Defile product flavors
*/
productFlavors {
amazon {
flavorGroup 'market'
}
google {
flavorGroup 'market'
}
flav1 {
flavorGroup 'version'
packageName 'com.company.flav1'
}
flav2 {
flavorGroup 'version'
packageName 'com.company.flav2'
}
flav3 {
flavorGroup 'version'
packageName 'com.company.flav3'
}
}
// .. Other stuff
Run Code Online (Sandbox Code Playgroud)
它很棒.所有源和资源都正确合并.但由于特定原因,我需要包后缀.amz为amazon产品风味.我怎样才能做到这一点?
我试过这种方式:
amazon {
flavorGroup 'market'
packageNameSuffix '.amz'
}
Run Code Online (Sandbox Code Playgroud)
但gradle抛出一个例外.
我正在使用 Kotlinscript 文件将 Android 应用程序转换为 Gradle Kotlin-DSL。
我在转换逻辑时遇到问题applicationId。我们不使用defaultConfigurationwith applicationIdplus 各种applicationIdSuffix口味来表达我们的口味,而是使用自定义逻辑。这个逻辑在这个 SO 答案中进行了描述,下面是常规代码:
flavorDimensions "price", "dataset"
productFlavors {
free { dimension "price" }
paid { dimension "price" }
dataset1 { dimension "dataset" }
dataset2 { dimension "dataset" }
}
android.applicationVariants.all { variant ->
def mergedFlavor = variant.mergedFlavor
switch (variant.flavorName) {
case "freeDataset1":
mergedFlavor.setApplicationId("com.beansys.freeappdataset1")
break
case "freeDataset2":
mergedFlavor.setApplicationId("com.beansys.freedataset2")
break
case "paidDataset1":
mergedFlavor.setApplicationId("com.beansys.dataset1paid")
break
case "paidDataset2":
mergedFlavor.setApplicationId("com.beansys.mypaiddataset2")
break
}
}
Run Code Online (Sandbox Code Playgroud)
对于 kotlin,我无法改变groovy 中的类似applicationId …