我一直在使用gradle和構建變體掙扎了一段時間。Gradle構建變體的文件夾命名約定
我有這些構建定義類型:
- 調試
- 發佈
而且這些口味:
- 免費
- 支付
我怎樣才能爲特定的構建變體定義獨特的資源和資產,即。 FreeDebug?例如,我需要四個不同的應用程序名稱,具體取決於構建版本,以及每個變體的不同圖標。
我一直在使用gradle和構建變體掙扎了一段時間。Gradle構建變體的文件夾命名約定
我有這些構建定義類型:
而且這些口味:
我怎樣才能爲特定的構建變體定義獨特的資源和資產,即。 FreeDebug?例如,我需要四個不同的應用程序名稱,具體取決於構建版本,以及每個變體的不同圖標。
我一直在努力解決同樣的問題。起初,我在我的源代碼控制中使用了兩個分支,但這是一個令人頭疼的問題,使它們保持同步。 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
根據Gradle Sourcesets and Dependencies guide,你可以添加一個新文件夾src/freeDebug/res
或src/paidRelease/res
等來定製每個構建變體的特定屬性。
的文件夾結構,同時創造建立變種應該是:在選擇特定
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中的值獲取應用程序名稱。應用程序圖標也一樣。
第二張圖片顯示,如何在項目結構看起來,如果你想每種味道有不同的代碼,圖形等,也表現出來。請記住MainActivity從主文件夾中刪除,以便它可以在每個構建變量
存在,如果你只是想改變一個圖標,而不是複製整個資源樹? – powder366
src/main/res適用於所有版本,因此您只需將構建變體之間的資源添加到構建變體特定文件夾 – ianhanniballake
好了,謝謝!但是當我將一個項目從Eclipse轉換到Studio時,我沒有得到src/main/java,就像正常情況下一樣。例如,對於sourceSets,我必須有一個main(因爲它是我猜的默認值)。不知道如何處理這個... – powder366