繁体   English   中英

Gradle:多维风味ApplicationId

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM