Gradle對多版本項目的管理
在實際工作中,我們可能會給很動客戶提供apk,而不同的客戶又有不同的需求,如果需求不是差別很大的話,通過Gradle來管理是非常方便的。 Gradle的Android plugin提供了productFlavors方法來實現對多個項目的管理,具體實現方法為在項目Gradle腳本的android配置下加入以下代 碼,就加入了兩個項目的版本管理,其強大的地方在于可以通過對不同flavor的sourceSets進行配置來實現差異化,比如在src/escape /values的值會在編譯時覆蓋main sourceSets里的res/values的值,達到overlay的效果,后面會詳細的對這項屬性進行介紹:
android{
. . . . . .
productFlavors{
escape{
versionName "1.0-escape"
}
tcl{
versionName "1.0-tcl"
}
}
. . . . . .
}
然后點擊Build Variant右邊的箭頭就可以選擇相應的版本進行編譯
詳細介紹Build variants(構建變種版本)
該項功能主要是用來從一個單獨工程創建一個應用的不同版本,這是非常有用的,如果你的app有一個demo版本和一個需要收費的版本或者你想在不同配置的設備上都不同的apk。
Gradle使用product flavors(產品的多樣化)來創建app的不同版本,每一個app版本可能有不同的特點或者設備需求。Gradle為每一個版本的app產生不同的apk。
構建變種
app的每一個版本在Gradle編譯系統中用一個build variant(構建變種)表示。構建變種信息包含了編譯類型和產品獨特配置(build types和product flavor)。Android studio默認定義了兩種編譯類型(debug和release),沒有定義產品配置。這些默認的項目由兩個構建變種組成,debug和 release,gradle會為每一個變種生成一個apk。
上面的例子中定義了兩個項目配置,escape和tcl,這會產生四個構建變種:
在編譯的時候有四種選擇,可以為每一個變種生成相應的apk。
- escape-debug
- escape-release
- tcl-debug
- tcl-release
在編譯每一個版本的app的時候,Gradle會從下面的目錄整合源代碼和資源:
flavor代碼目錄的使用數量是根據工程的flavor配置來決定的:
- src/main/ 主要的代碼目錄(對所有的變種都通用)
- src/<buildType>/ 編譯類型代碼目錄
- src/<flavorName> falvor代碼目錄
- 對于沒有定義任何flavors的工程,構建系統不會使用任何的flavor代碼目錄,比如為了產生沒有定義flavors的release版本變種,構建系統使用下列目錄:
src/main/
src/release/(build type)
- 對于定義了一些flavors的工程,構建系統會使用一個flavor代碼目錄,例如,產生上面的escape-debug構建變種,構建系統會使用下列目錄:
src/main/
src/debug/(build type)
src/escape/(flavor)
這些目錄的代碼會被共同使用來產生構建變種的輸出,可以在不同的目錄中存在相同名稱的類,只要它們不在同一個變種的構建中使用。構建系統會把所有的 manifests整合成一個manifest,所以每一個構建變種都可以定義在manifest中定義不同的組件或者權限。
構建系統會把所有的資源目錄組合到一起,如果在一個構建中,不同的目錄包含相同名稱的資源,優先級順序為:build type的資源覆蓋product flavor的資源,product flavor的資源覆蓋main source目錄的資源。
創建app不同版本的步驟:
1.在build文件中定義product flavors
2.為每一個flavor創建source目錄,例如為escape flavor創建以下目錄
app/src/escape/java
app/src/escape/res
app/src/escape/res/layout
app/src/escape/res/values
3.為project添加屬于flavor的代碼和資源