2014-10-28 58 views
8

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

flavorDimensions "shape", "color" 

productFlavors { 

    blue { 
     flavorDimension "color" 
    } 

    red { 
     flavorDimension "color" 
    } 

    green { 
     flavorDimension "color" 
    } 


    square { 
     flavorDimension "shape" 
    } 

    circle { 
     flavorDimension "shape" 
    } 

我希望能够设置不同的applicationID对每个变种,如:squareblue将有一个不同的applicationID到circleblue。我无法在颜色维中设置applicationId,因为它对每个形状都是一样的。在上面的例子中,我需要6个不同的applicationIds。这些Ids也不遵循任何模式,它们可能是任何东西。

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

我真正想要做的是在颜色维上设置两个applicationids,然后根据形状尺寸在构建时选择正确的一个。我尝试过定义变量,但没有取得任何成功,他们只是被最后一个变体覆盖。

+1

你的构建文件都写在一个图灵完备的语言,所以你必须做相当多的潜力。你不能在你链接的那个问题上建立代码,并添加你自己的逻辑来生成应用程序ID吗? – 2014-10-28 16:03:54

+0

ApplicationIDs已经存在,可能是任何东西,所以没有合理的方式来创建它们。我可以在variantFilter中添加每个变体,但是这需要在我的gradle文件中添加数千行以检查每个变体。 – 2014-10-28 16:11:29

+0

如果没有合理的方法来创建它们,我不确定它有什么合理的选择 - 你必须在某个地方对它们进行硬编码。您可以将它们保存为CSV文本文件,然后在构建文件中编写代码,将其读入地图并应用。 – 2014-10-28 16:13:42

回答

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, "", "") 
} 

然后你produc内牛逼的味道,你可以为每个形状类型

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部分中添加所有的Ids,然后variantFilter根据第一种风味设置正确的applicationId。

+0

添加每种风味的扩展听起来像是一个很好的解决方案。 (per-flavor额外的属性也应该有效。)而不是'productFlavors.whenObjectAdded {...}',你可以/应该使用'productFlavors.all {...}'。 – 2014-10-29 12:05:23

0

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) 
     } ... 
    } 
0
def appId = "my.custom.package" 

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

defaultConfig { 
     applicationId "${appId}" 
     ............... 
} 
相关问题