2013-10-28 79 views
12

我一直在使用gradle和構建變體掙扎了一段時間。Gradle構建變體的文件夾命名約定

我有這些構建定義類型:

  • 調試
  • 發佈

而且這些口味:

  • 免費
  • 支付

我怎樣才能爲特定的構建變體定義獨特的資源和資產,即。 FreeDebug?例如,我需要四個不同的應用程序名稱,具體取決於構建版本,以及每個變體的不同圖標。

回答

12

我一直在努力解決同樣的問題。起初,我在我的源代碼控制中使用了兩個分支,但這是一個令人頭疼的問題,使它們保持同步。 Gradle是一個非常靈活的構建系統,但默認約定並不總是足夠的。這是我最終如何在我的代碼庫中解決它的。

我結束了實質上包含以下目錄結構(簡體):

+ src 
    + main 
    | + res 
    | | + values 
    | | - strings.xml 
    | + java 
    | ... 
    + debug 
    | + free 
    | | + res 
    | | + values 
    | |  - strings.xml 
    | + paid 
    | + res 
    | + values 
    |  - strings.xml 
    + free 
    | + res 
    | | + values 
    | | - strings.xml 
    | + java 
    | ... 
    + paid 
    + res 
    | + values 
    | - strings.xml 
    + java 
     ... 

在主文件夾,我把一切有兩種口味常見。在免費文件夾中,我保留免費版本的所有內容(與付費版本相同)。 flavor文件夾中的文件將覆蓋在main的頂部。

默認覆蓋規則將通過使用「src」下具有相同名稱的文件夾來處理產品風味「免費」和「付費」。對我來說,問題開始於構建類型的疊加。

如果我創建了一個與flavor文件夾具有相同結構的調試文件夾,它將被覆蓋在當前使用的flavor文件夾之上。這導致了兩種風格的調試名稱相同,但是我根據風格需要不同的調試名稱。經過一番研究之後,我想到了對我的構建文件的以下修改。

... 

android { 
    buildTypes { 
     debug { 
      ... 
     } 
     release { 
      ... 
     } 
    } 

    productFlavors { 
     free {} 
     paid {} 
    } 
} 

android.applicationVariants.all { variant -> 
    if (variant.buildType.name == "release") { 
     ... 
    } 
    else if (variant.buildType.name == "debug") { 
     switch (variant.name) { 
      case "FreeDebug": 
       variant.mergeResources.doFirst { 
        android.sourceSets.debug.setRoot("src/debug/free") 
       } 
       break; 
      case "PaidDebug": 
       variant.mergeResources.doFirst { 
        android.sourceSets.debug.setRoot("src/debug/paid") 
       } 
       break; 
     } 
    } 
} 

... 

現在構建變量可以先覆蓋以下文件夾中建:

PaidRelease -> /src/main + /src/paid 
PaidDebug -> /src/main + /src/paid + /src/debug/paid 

FreeRelease -> /src/main + /src/free 
FreeDebug -> /src/main + /src/free + /src/debug/free 
11

根據Gradle Sourcesets and Dependencies guide,你可以添加一個新文件夾src/freeDebug/ressrc/paidRelease/res等來定製每個構建變體的特定屬性。

+0

存在,如果你只是想改變一個圖標,而不是複製整個資源樹? – powder366

+2

src/main/res適用於所有版本,因此您只需將構建變體之間的資源添加到構建變體特定文件夾 – ianhanniballake

+0

好了,謝謝!但是當我將一個項目從Eclipse轉換到Studio時,我沒有得到src/main/java,就像正常情況下一樣。例如,對於sourceSets,我必須有一個main(因爲它是我猜的默認值)。不知道如何處理這個... – powder366

1

的文件夾結構,同時創造建立變種應該是:在選擇特定

app 
    | 
    ->src 
     | 
     ->buildvariantname1(as defined in gradle) 
          | 
          ->java (follow the same structure here, as in main folder) 
          ->res (follow the same structure here, as in main folder)  

現在與buildVariantname1debug類似,將選擇在此變體下的res文件夾中寫入的更改。

應該在res-> values文件夾下的string.xml下定義應用程序名稱,以便根據每個構建變體下xml中的值獲取應用程序名稱。應用程序圖標也一樣。

第一張圖片展示瞭如何聲明構建變種(不同的包名口味)
enter image description here

第二張圖片顯示,如何在項目結構看起來,如果你想每種味道有不同的代碼,圖形等,也表現出來。請記住MainActivity從主文件夾中刪除,以便它可以在每個構建變量

enter image description here