【问题标题】:Gradle: Multi-Dimension Flavor ApplicationIdGradle:多维风味ApplicationId
【发布时间】:2014-10-28 15:39:05
【问题描述】:

我有一个相对复杂的项目,每个应用都需要两个风味维度。我在下面的示例中更简单地重写了它:

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 个不同的 applicationId。这些 Id 也不遵循任何模式,它们可以是任何东西。

我在这里看到了答案:How to set different applicationId for each flavor combination using flavorDimensions?,但这意味着我需要手动设置它,这对我的项目来说是不可行的,因为变体的数量(1000s)。

我真正想做的是在颜色维度上设置两个 applicationid,然后在构建时根据形状维度选择正确的一个。我尝试定义变量,但没有成功,它们只是被最后一个变体覆盖。

【问题讨论】:

  • 您的构建文件是用图灵完备的语言编写的,因此您有潜力做很多事情。你不能在你链接到的那个问题的代码上构建并添加你自己的逻辑来生成应用程序 ID 吗?
  • ApplicationID 已经存在并且可以是任何东西,因此没有逻辑的方式来创建它们。我可以在 variantFilter 中添加每一个,但这需要在我的 gradle 文件中添加数千行额外的行以检查每个变体。
  • 如果没有合乎逻辑的方法来创建它们,我不确定有什么合理的替代方案——你必须在某个地方对它们进行硬编码。您也许可以将它们保存在 CSV 文本文件中并在构建文件中编写代码以将其读入地图并应用它。
  • 啊,是的,我知道我必须对它们进行硬编码,我想要将它添加到 productFlavor 中。所以我会有类似 applicationIdSquare 和 applicationIdCircle 的东西,它会根据其他风味维度选择正确的。

标签: android groovy gradle android-studio


【解决方案1】:

Gradle 有一个内置的extras property,所以你可以在不定义类的情况下做到这一点。

看起来像这样,可能是一两个错字:

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)
        } ...
    }

【讨论】:

    【解决方案2】:

    我在此示例中找到了一个解决方案:Gradle Android Plugin - add custom flavor attribute?

    如果您将这样的类添加到您的 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。

    【讨论】:

    • 添加每个风味的扩展听起来是个不错的解决方案。 (每种口味的额外属性也应该可以工作。)您可以/应该使用productFlavors.all { ... },而不是productFlavors.whenObjectAdded { ... }
    【解决方案3】:
    def appId = "my.custom.package"
    
    if (appId == "some.package") { 
         ..... Change conditions based on the flavors maybe defined more variables
    }
    
    defaultConfig {
            applicationId "${appId}"
           ...............
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多