[英]Gradle: Multi-Dimension Flavor ApplicationId
我有一个相对复杂的项目,每个应用程序都需要两个维度。 在下面的示例中,我将其重写得更加简单:
flavorDimensions "shape", "color"
productFlavors {
blue {
flavorDimension "color"
}
red {
flavorDimension "color"
}
green {
flavorDimension "color"
}
square {
flavorDimension "shape"
}
circle {
flavorDimension "shape"
}
我希望能够为每个变体设置不同的applicationId,例如:squareblue将对circleblue设置不同的applicationId。 我无法在颜色尺寸中设置applicationId,因为每个形状都相同。 在上面的示例中,我将需要6个不同的applicationIds。 这些ID也不遵循任何模式,它们可以是任何东西。
我在这里看到了答案: 如何使用flavourDimensions为每种风味组合设置不同的applicationId? 但这意味着我需要手动设置它,由于变体的数量(1000个),这对于我的项目是不可行的。
我真正想做的是在颜色尺寸上设置两个applicationid,然后在构建时根据形状尺寸选择正确的一个。 我尝试过定义变量,但是还没有成功,它们只是被最后一个变量覆盖。
Gradle内置了一个extras属性 ,因此无需定义类即可执行此操作。
看起来像这样,可能打了两个错字:
productFlavors {
blue {
flavorDimension "color"
ext.squareId = "yourAppId"
ext.circleId = "yourAppId"
}
android.applicationVariants.all { variant ->
def flavors = variant.getFlavors()
if (flavors[0].name.equals("square")){
variant.mergedFlavor.setApplicationId(flavors[1].ext.squareId)
} ...
}
我从这里的此示例中找到了以下解决方案: Gradle Android插件-添加自定义的flavour属性?
如果将这样的类添加到gradle文件中,则可以将自定义属性添加到productFlavor
class AppIdExtension {
String squareId
String circleId
AppIdExtension(String sId, String cId){
squareId = sId
circleId = cId
}
public void setSquareId(String id){
squareId = id
}
public String getSquareId(){
squareId
}
public void setCircleId(String id){
circleId = id
}
public String getCircleId(){
circleId
}
}
然后,通过在android { }
部分的开头添加以下代码,将其添加到每种口味的扩展中
productFlavors.whenObjectAdded { flavor ->
flavor.extensions.create("shapeIds", AppIdExtension, "", "")
}
然后在您的产品风味内,您可以设置每种形状类型的值
blue {
flavorDimension "color"
platformIds.squareId "yourAppId"
platformIds.circleId "yourAppId"
}
最后,在productFlavors { }
部分之后,添加以下内容:
android.variantFilter { variant ->
def applicationId = ""
def flavors = variant.getFlavors()
if(flavors[0].name.equals("square")){
applicationId = flavors[1].platformIds.squareId
} else if(flavors[0].name.equals("circle")){
applicationId = flavors[1].platformIds.circleId
}
variant.getDefaultConfig().applicationId applicationId
}
这可能不是实现它的最优雅或最有效的方法,但是它对我来说是完美的。 现在,我可以在productFlavor部分中添加所有我的ID,然后variantFilter根据第一种口味设置正确的applicationId。
def appId = "my.custom.package"
if (appId == "some.package") {
..... Change conditions based on the flavors maybe defined more variables
}
defaultConfig {
applicationId "${appId}"
...............
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.