今天來看一下Android Studio中的多渠道打包功能。主要應用到了Gradle中的Product Flavors配置。
首先建立一個普通的APP工程。創建好後默認的結構如下:
可以看到默認包含main這一主幹版本。
接下來加入我們向發佈一個Foo的渠道版本,需要對工程進行配置。
結合網上查到的資料和我的實踐,簡要來說有以下幾個注意點:
1.最新的Android Studio已經可以通過圖形界面來配置多個Flavor。
2.若不使用圖形界面配置Flavor,那麼需要手工編寫app的build.gradle文件
3.如果不預先配置Flavor信息,那麼在配置工程目錄及源碼文件時,不會有相應的輔助功能。
因此我們按照順序:
先配置Flavor信息,然後再配置Flavor的源碼及相關文件目錄。
圖形界面配置:
1.首先右鍵點擊工程目錄,選擇“open module settings”
2.打開app的flavor選項卡,按照需要填寫相關配置。如圖:
打開app工程的build.gradle腳本,發現Android Studio已經幫我們自動填充了Product Flavors的配置。
因此,若想手動編寫gradle代碼,直接寫入這些配置即可:
productFlavors {
foo {
minSdkVersion 15
applicationId 'com.example.multiflavorfoo'
targetSdkVersion 23
versionCode 1
versionName '1.0'
}
}
接下來創建Flavor相應的目錄。
1.右鍵單擊app文件夾,新建目錄並命名爲foo。
2.在foo中繼續新建一個文件夾java。
可以看到Android Studio默認將java文件夾標示成藍色圖標(與main的java相同,表示這是一個源碼文件夾),此時右鍵點擊java文件夾,可以新建package。若是普通的黃色標識文件夾,右鍵菜單是沒有新建package選項的。
我們也可以在gradle中指定某個flavor的路徑:
sourceSets {
foo {
java.srcDirs = ['src/foo/java']
res.srcDirs = ['src/foo/res']
}
}
繼而在此新建package並創建MainActivity.java。
這時可以看到Android Studio報錯,說此處有類衝突(Duplicate class)——MainActivity和main主幹中的MainActivity衝突了。
這是由於gradle編譯flavor時,總會檢查分支代碼路徑和主幹代碼路徑,所以不可避免的產生了類衝突。
假如確實有這種需求:兩個分支中存在某個相同名稱的類。那麼可以再新建一個分支bar,使用foo和bar開發,並將main中的重名類刪除掉。
仿照剛纔的步驟,新建一個bar分支:
productFlavors {
foo {
minSdkVersion 15
applicationId 'com.example.multiflavorfoo'
targetSdkVersion 23
versionCode 1
versionName '1.0'
}
bar {
minSdkVersion 15
applicationId 'com.example.multiflavorbar'
targetSdkVersion 23
versionCode 1
versionName '1.0'
}
}
然後再新建相應文件夾,會發現java文件夾不會默認標藍,也不能在下面創建package了。
實際在windows資源管理器中手動創建這些文件夾是完全沒有問題的,而且運行gradle命令也可以正確編譯工程。
這裏實際是Android Studio上層給開發人員的限制——同一時間僅可在一個flavor上開發。
如果想切換到bar flavor開發,需要在Build Variants面板中選擇bar爲當前的Build Variant。
然後就會發現foo這一分支不可操作了,bar下的文件夾按照我們的配置可以正常使用了。
由於foo分支不是當前編譯選定的分支,因此java中的package文件夾都按普通的文件夾處理顯示。
這時將main中的MainActivity剪切到bar下,會發現即使切換回foo分支,類衝突的錯誤也不存在了。
開發完不同flavor,可使用gradle task
命令查看各個分支可編譯的選項,運行相應命令;
或者通過Build Variant面板選擇當前要編譯的版本,在Android Studio中運行即可。