Gradle:Multi-Dimension Flavor ApplicationId

时间:2014-10-28 15:39:06

标签: android groovy gradle android-studio

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

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也不遵循任何模式,它们可以是任何模式。

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

我真正想要做的是在颜色维度上设置两个应用程序,然后根据形状维度选择正确的应用程序。我已经尝试过定义变量但是没有取得任何成功,它们只是被最后一个变种覆盖了。

3 个答案:

答案 0 :(得分:1)

Gradle内置extras property,因此您可以在不定义类的情况下执行此操作。

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

private static final double GOLDEN_NUMBER = 1.618d;

public long fibonacci(int n) {
    double sqrt = Math.sqrt(5);

    double result = Math.pow(GOLDEN_NUMBER, n);

    result = result - Math.pow(1d - GOLDEN_NUMBER, n);

    result = Math.round(result / sqrt);

    return Double.valueOf(result).longValue();
}

答案 1 :(得分:0)

我在此示例中找到了一个解决方案: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。

答案 2 :(得分:0)

def appId = "my.custom.package"

if (appId == "some.package") { 
     ..... Change conditions based on the flavors maybe defined more variables
}

defaultConfig {
        applicationId "${appId}"
       ...............
}