Android Gradle 多渠道打包

語言: CN / TW / HK

一、前言

什麼是多渠道打包以及多渠道打包可以做什麼,這裡就不做介紹了,相信看到這篇文章的你已經瞭解了,多渠道打包的方式比較多,這裡我們用Gradle多渠道打包方式。

和其他文章有什麼不同

網上看到的大多數文章都只講解了

1.如何修改包名

2.如何修改變數的值

3.如何替換string中的資源

4.如何替換AndroidManifest中的資源

本篇文章會在上述知識點上增加

5.不同渠道如何使用不同的java檔案

6.Base模組化中如何使用多渠道

新建專案,在app下build.gradle中android下新增如下程式碼:

productFlavors{
baidu{
applicationId "com.baidu"
buildConfigField "String","BaseApi",'"http://baidu.com"'
resValue "string","tip",'"hello this is form baidu"'
manifestPlaceholders = [
app_name:"百度APP"
]
}
sougou{
applicationId "com.sougou"
buildConfigField "String","BaseApi",'"http://sougou.com"'
resValue "string","tip",'"hello this is form sugou"'
manifestPlaceholders = [
app_name: "搜狗APP"


]


}
}

這裡我們定義兩個渠道,一個渠道名稱是baidu,一個渠道名稱是sougou,通過applicationId直接指定應用包名

不同渠道我們使用的請求地址不同,欄位是BaseApi,我們可以通過buildConfigField指定BaseApi中的值,通過buildConfigField

指定的值,我們可以在系統生成的BuildConfig中獲取,比如我們獲取多渠道中定義的BaseApi:

String baseApi = BuildConfig.BaseApi;

我們來看下BuildConfig中的內容

BaseApi是我們自己定義的,其他的都是預設生成的,這裡我們可以看到,應用包名也是我們指定的。

resValue我們可以修改變數的值,這個值會生成在string.xml中,比如上面我們定義了一個tip變數,需要注意的是,這個變數不能出現在string.xml中,否則會提示資源重複。

如果要定義在配置檔案中使用的值,則需要使用

manifestPlaceholders

我們分別修改app_name的值,在配置檔案中使用佔位符${} 使用,如下:

android:label="${app_name}"

接下來,我們將tip的值和BaseApi顯示在TextView上,分別執行app的baidu渠道版本和sougou渠道版本

baidu渠道執行如下:

sougou渠道執行如下:

從執行結果我們可以看出來,已經達到我們想要的結果了。

如何使用不同的app圖示

那麼如何修改不同渠道的app圖示呢,當然我們可以在manifestPlaceholders中新增圖示資源的佔位符,但是我們這裡使用另一種方法,

有時候我們不僅要替換圖示,可能要替換raw下的資源或者assets下的資源,這種情況下我們就需要

使用下面的方式:

在src目錄下新建與main同級且與渠道名稱一樣的檔案包名,並且新建res資源目錄,放入圖示使用的圖片資源,必須要與main中的名稱相同才可以覆蓋,如圖所示:

並且在gradle中設定sourceSet

sourceSets{
baidu{
res.srcDirs = ['src/baidu/res','src/baidu/res']


}
sougou{
res.srcDirs = ['src/sougou/res','src/sougou/res']


}


}

我們通過res.srcDirs就指定了不同渠道使用的資原始檔,這裡從網上隨便找了兩張截圖作為圖示(如有侵權,聯絡刪除)

執行兩個app,結果顯示如下:

moudle中如何配置多渠道

在實際的開發中,我們可能會有一個base模組,不同渠道base模組中引用的資源也不同,我們該如何配置呢?

我們新建basemoudle模組,app依賴basemodule模組

同樣,我們在模組的gradl下 配置如下:

productFlavors {
baidu {


buildConfigField "String", "BaseMoudeDesc", '"這是base模組百度的描述"'
resValue "string", "basetip", '"i come form base_baidu"'


}
sougou {
buildConfigField "String", "BaseMoudeDesc", '"這是base模組搜狗的描述"'
resValue "string", "basetip", '"i come form base_baidu"'


}
}

因為我們的base模組也有兩個渠道,所以app在依賴的時候,必須分渠道去依賴

baiduCompile project(path:':basemodule',configuration:'baiduRelease')
sougouCompile project(path: ':basemodule',configuration:'sougouRelease')


我們直接編譯會出現上面的問題,因為module模組可能沒有生成對應的編譯資源,因為android的預設編譯是debug型別的,所以為了和app主模組同步,我們設定去掉預設的釋出型別,需要在module中的gradle中新增:

publishNonDefault true
變數的使用和上面app的使用方式一樣,在這裡就不展示了。

不同渠道如何使用不同java檔案

同不同渠道使用資原始檔一樣,不過需要注意的是,main檔案中就不能存放要替換的java檔案了,否則會報資源重複的錯誤,同樣的我們在base模組分別新建baidu和sougou渠道包,並且分別新建MainActivity,如圖所示。

設定java資源目錄

sourceSets {
baidu {
res.srcDirs = ['src/baidu/res', 'src/baidu/res']
java.srcDirs = ['src/baidu/java','src/baidu/java']


}
sougou {
res.srcDirs = ['src/sougou/res', 'src/sougou/res']
java.srcDirs = ['src/sougou/java','src/sougou/java']


}


}


為了展示兩個頁面的不同,我們將百度渠道的頁面背景設為粉紅色,搜狗渠道的頁面背景設定藍色,在app新增按鈕並新增監聽事件,開啟module中的主頁面。

執行效果如下所示:

到這裡,常用的多渠道打包需要的配置就結束了,如有錯誤歡迎指正。

作者:黃林晴_阿黃哥

連結:https://juejin.im/post/6894117336065212423

關注我獲取更多知識或者投稿