簡體   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