Android之通過配置Flavor實現(xiàn)一個項目打包成多個apk

productFlavors

先來看一段代碼

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">android {
compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig {
applicationId "com.z.q.flavor" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
productFlavors{
flavor1{//自定義flavor1的參數(shù)
applicationId "com.z.q.flavor1" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" }
flavor2{//在defaultConfig的基礎(chǔ)上做修改
applicationIdSuffix ".flavor2"http://輸出:com.z.q.flavor.flavor2
versionNameSuffix "-flavor2"http://輸出:1.0-flavor2
}
}
...
}</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

這個是module里面的build.gradle部分代碼,這里面主要增加的productFlavors,這個就是來配置不同項目的參數(shù)。在這里我配置了兩個項目,分別是flavor1和flavor2。不同的項目ID當(dāng)然需要不同,配置ID的方法有兩種:
1. 第一種就是直接使用applicationId這個屬性,直接給flavor1配置一個ID;
2. 第二種就是使用applicationIdSuffix這個屬性,這個的意思是在defaultConfig的默認(rèn)ID基礎(chǔ)上在后面追加一段。

而versionName也是和applicationId一樣有兩種方法。如果沒配置的屬性會默認(rèn)的使用defaultConfig里面的屬性。到這里不同項目的build.gradle里面的配置大致完成了,如果還想了解更多的配置信息,可以到Google官網(wǎng)了解。

資源文件配置

在build.gradle我配置了兩個項目,那么相應(yīng)的需要建立兩個資源文件夾。

在build.gradle我配置了兩個項目,那么相應(yīng)的需要建立兩個資源文件夾。
[圖片上傳失敗...(image-472c82-1597806735941)]

這兩個文件名字必須和build.gradle里面配置的兩個Flavors名字相同,現(xiàn)在可以在這兩個文件夾里創(chuàng)建各自項目的資源了。
在這兩個文件夾里面創(chuàng)建資源的時候一定要和main的文件格式一致,如圖:
[圖片上傳失敗...(image-91ae17-1597806735941)]

這個文件格式一致是指包名必須相同。這時有人可能會問為什么flavor1里面有res資源文件,為什么flavor2里面沒有呢?

我們先從main文件夾來看,在main文件夾里面有Java代碼文件,res資源文件和清單文件。在配置Flavor中,在進(jìn)行構(gòu)建的時候會將選中的Flavor和main進(jìn)行結(jié)合構(gòu)建,說白了就是如果Flavor沒有的東西就會使用main里面的代替。上圖,我就選中了flavor2,具體怎么選著請看下圖。因為flavor2中沒有res資源和清單文件,那么它就會使用main里面的res資源和清單文件;而如果選著flavor1,那么就會使用flavor1中res資源里面的布局文件。在這里可以看到不同項目中的res資源可以有相同的,Android studio在編譯的時候會優(yōu)先使用Flavor里面的res資源,如果沒有再使用main的res資源。
[圖片上傳失敗...(image-c3c3e1-1597806735941)]

細(xì)心的同學(xué)可能會發(fā)現(xiàn)Java文件夾里面的代碼文件,為什么兩個Flavor中都有Flavor代碼文件,而main中卻沒有,但是main中有MainActivity代碼文件,而兩個Flavor文件中卻沒有。這是因為在編譯的時候,F(xiàn)lavor的Java的文件不會覆蓋main里面的Java的文件,所以如果Flavor里面有的Java文件,main里面就不能有,如果是所有項目都相同的Java文件,那么就可以放在main文件里。

到目前為止main文件里面,已經(jīng)把Java代碼文件和res資源文件說明,剩下就只有清單文件了,清單文件比較特殊,需要單獨拿來講解。

清單文件

清單文件不像Java代碼文件那樣每個項目相同的Java代碼文件不可以和main中的Java代碼文件共存,而是main和每個項目都可以有清單文件,但是又不會像res資源文件那樣項目中的res資源文件會覆蓋main的res資源文件。

在編譯的時候Android studio會把main的清單文件和選中項目的清單文件合并,但是合并就會出現(xiàn)沖突。其實谷歌那邊早就想到會有這些問題,所以已經(jīng)提供了解決的方法了。

在這里我只介紹兩種合并方法:merge和replace

[圖片上傳失敗...(image-e0f689-1597806735941)]

這張是main的清單文件

[圖片上傳失敗...(image-dfa0a5-1597806735941)]

這是flavor1的清單文件

image.png

這是flavor2的清單文件

在main的清單文件中缺少了主題,而在flavor1清單文件中只有主題沒有其他,那么在這里使用merge就會把main和flavor1的aplication的屬性相結(jié)合。
而在flavor2中所有都齊全,只是label不同,這里使用replace就會把main里面的application的屬性全都替換掉。

如果在application中使用這兩個屬性,除了會把application的屬性和main的清單文件里面的application屬性結(jié)合以往,還會把application包含的activity,service等都結(jié)合,所有在這里要謹(jǐn)慎使用。

還可以使用其他屬性來進(jìn)行結(jié)合,具體可以去查看Google的開發(fā)者文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容