flavor android build,android BuildType和BuildFlavor
Build Variant
android gradle 插件,允許對(duì)最終的包以多個(gè)維度進(jìn)行組合
BuildVariant = ProductFlavor x BuildType
兩個(gè)維度
最常見(jiàn)的就是這樣:
productFlavors {
pro {
}
fre {
}
}
lintOptions {
abortOnError false
}
buildTypes {
debug {
}
release {
}
}
其中,buildTypes 一般都會(huì)有 debug 或者release,標(biāo)示編譯的類型,通常在混淆代碼、可調(diào)式、資源壓縮上做一些區(qū)分。
productFlavor 則為了滿足“同一個(gè)project,根據(jù)一個(gè)很小的區(qū)分,來(lái)打不同的包”這個(gè)需求。
這兩個(gè)維度的組合,會(huì)產(chǎn)生如下包:
proDebug
proRelease
freDebug
proRelease
更多的維度
flavorDimensions 'abi', 'version'
productFlavors {
pro {
dimension 'version'
}
fre {
dimension 'version'
}
arm {
dimension 'abi'
}
mips {
dimension 'abi'
}
}
buildTypes {
debug {
}
release {
}
}
productFlavor 本身定義了2個(gè)維度,記上 buildType,則有三個(gè)維度,會(huì)產(chǎn)生如下的包:
armProDebug
armProRelease
armFreDebug
armFreRelease
mipsProDebug
mipsProRelease
mipsFreDebug
mipsFreRelease
其中每個(gè)維度組合,都可以設(shè)置本身的 dependency、test source。下面做一個(gè)舉例。
Flavor 與 Dependency
需求
module 中有若干個(gè) flavors,例如:fre 和 pro,分別依賴不同的庫(kù),這些庫(kù)有的是本地 jar 庫(kù),有的是遠(yuǎn)程庫(kù)。
方案
image.png
屏幕快照 2020-06-19 下午1.38.36.png
BuildType,構(gòu)建類型,主要針對(duì)開(kāi)發(fā)生命周期的不同階段進(jìn)行配置。一個(gè)模塊或者項(xiàng)目,默認(rèn)有兩種類型,release 和 debug。 debug 類型下 debuggable 屬性是 true,從而使得我們可以打斷點(diǎn)進(jìn)行調(diào)試。debug 類型在打包的時(shí)候,會(huì)使用默認(rèn)的自動(dòng)生成的簽名,對(duì)于 release 類型來(lái)說(shuō),發(fā)布的時(shí)候需要使用我們自己的密鑰進(jìn)行簽名。同時(shí),我們還可以在發(fā)布的時(shí)候,進(jìn)行代碼混淆。
signingConfigs {
a {
}
release {
}
defaultSigning {
keyAlias 'xxx'
keyPassword 'xxx'
storeFile file('xxxxx')
storePassword 'xxxx'
}
}
resnginConfings 里邊可以隨便命名寫(xiě)配置名字,如:a,release,defaultSigning直接在buildTypes 的類型里邊配置 signingConfig來(lái)配置
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
debuggable false
signingConfig signingConfigs.defaultSigning
}
debug {
}
buildToolsVersion '28.0.3'
}
你建立幾個(gè)buildType,在buildFlavor就會(huì)出現(xiàn)幾個(gè)類型
屏幕快照 2020-06-19 下午1.37.38.png
注意:
屏幕快照 2020-06-19 下午2.16.32.png
你在Active Build Variant選擇了那個(gè),那個(gè)文件夾中的java的顏色就變成深藍(lán)色,res文件夾就變成res的文件夾了
如何使用構(gòu)建變體
上一節(jié),說(shuō)了什么是構(gòu)建變體,但是,我們?cè)撛趺词褂靡詽M足我們的需求呢?有兩個(gè)地方,給我們帶來(lái)了可能性:BuildConfig 和 SourceSet(源集)。
BuildConfig
也許你已經(jīng)注意到了上面 productFlavor 中的
buildConfigField "String", "NAME", "\"免費(fèi)版\""
事實(shí)上,對(duì)于每一種變體,都會(huì)有一個(gè) BuildConfig 與之一一對(duì)應(yīng)。
我們來(lái)看看構(gòu)建變體free.debug 的BuildConfig:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.ygs.test.free.debug";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "free";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0-free";
// Fields from product flavor: free
public static final String NAME = "免費(fèi)版";
}
這些字段都是靜態(tài)常量,在項(xiàng)目中,我們都可以通過(guò) BuildConfig 直接訪問(wèn)。比如,你可以通過(guò) BuildConfig.DEBUG 判斷當(dāng)前版本是否是 debug 版本;可以通過(guò) BuildConfig.FLAVOR 判斷當(dāng)前的 productFlavor,已決定是否啟用某個(gè)功能。當(dāng)然,我們也可以自定義字段,比如
把格式說(shuō)一下 buildConfigField("常量類型","常量名稱","常量值")
buildConfigField "String", "NAME", "\"免費(fèi)版\""
flavorDimensions "mode"
productFlavors{
dev{
dimension "mode"
buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/dev/"')
buildConfigField("boolean", "UPDATE", "true")//那里需要用了,直接BuildConfig.UPDATE就取出來(lái)了,就這么簡(jiǎn)單
}
tes{
dimension "mode"
buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/tes/"')
buildConfigField("boolean", "UPDATE", "false")
}
pro{
dimension "mode"
buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/pro/"')
buildConfigField("boolean", "UPDATE", "false")
}
}
可以用來(lái)配置清單文件里面的值
這個(gè)最常用的就是在清單文件里面需要配置app_key,app_id的時(shí)候了,很多的三方SDK是需要配置這個(gè)東西的,比如某盟,某語(yǔ)音等等一大堆,這個(gè)時(shí)候,開(kāi)發(fā)是用的key和id肯定不能正是環(huán)境也用,或者給不同的客戶打不同的包,用的也不能一樣,這是后,需要進(jìn)行一些配置:
在清單文件(AndroidManifest)里面,application節(jié)點(diǎn)下這樣配置:
android:name="app_id"
android:value="${app_id_value}" />//占位符
android:name="app_key"
android:value="${app_key_value}" />
在剛剛的productFlavors下面這樣配置:
productFlavors{
dev{
dimension "mode"
buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/dev/"')
manifestPlaceholders = [app_id_value : "123456"
,app_key_value : "654321"]
}
tes{
dimension "mode"
buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/tes/"')
manifestPlaceholders = [app_id_value : "111111"
,app_key_value : "222222"] //替換兩個(gè)以上的用逗號(hào)隔開(kāi)
}
pro{
dimension "mode"
buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/pro/"')
manifestPlaceholders = [app_id_value : "223344"
,app_key_value : "556677"]
}
}
上述這些字段,無(wú)論是自定義的,還是默認(rèn)的,都可以成為我們?cè)陧?xiàng)目中的判斷條件。
image.png
SourceSet
所以源集,即代碼和資源的分組。這可能有點(diǎn)抽象,舉個(gè)栗子,src/main 就是一個(gè)源集。
每個(gè) buildType 可以有一個(gè)源集,每個(gè) buildFlavor 可以有一個(gè)源集,每個(gè) buildVariant 同樣可以有一個(gè)源集。
其中,src/main 這個(gè)源集是所有源集所共有的,除此之外,源集之間互斥。
image.png
如上圖所示,一共有三個(gè)源集:freeDebug、freeRelease、main。
注意,freeDebug、freeRelease 實(shí)際上是使用 buildVariant 的構(gòu)建的源集,需要和構(gòu)建變體的名字一樣(當(dāng)然可以通過(guò)配置修改這種默認(rèn)行為)。
這里有幾點(diǎn)注意事項(xiàng):
對(duì)于 java 文件來(lái)講,freeDebug 中不能出現(xiàn)和 main 中一樣在同一個(gè)包下類名相同的 java 文件,因?yàn)樗麄冎g是共享關(guān)系,相當(dāng)于將 main 中的所有 java 和 freeDebug 合并在一起。如果出現(xiàn)兩個(gè)相同名字的 java 文件,會(huì)報(bào)錯(cuò)。freeDebug 和 freeRelease 不同,它們所有的資源都是互斥的,相互不影響,因?yàn)槲覀冊(cè)跇?gòu)建的時(shí)候,也只能選擇其中一種進(jìn)行構(gòu)建。假設(shè)我們選擇了 freeDebug,那么 freeRelease 就會(huì)被剔除在外。
對(duì)于 res 文件夾下的這些資源文件,freeDebug 和 freeRelease 這些源集之間同樣是互斥的,相互沒(méi)有任何影響。但是對(duì)于不同源集和 main之間,卻存在著資源合并或替換的情況。
對(duì)于 drawable 及其相關(guān)文件夾下的圖片而言,freeDebug 中的圖片會(huì)直接覆蓋 main 中的同名圖片。對(duì)于 layout 文件夾下的布局文件也是這樣。
但是,對(duì)于 values 文件夾下的 xml 文件來(lái)說(shuō),確是文件內(nèi)容的合并。比如在源集 main 中的 strings.xml 中
App
Hello world!
在源集 freeDebug 中的 strings.xml 中
FreeDebug
它們合并之后就是
FreeDebug
Hello world!
最后,非常重要的一點(diǎn),合并或者替換時(shí)會(huì)遵照優(yōu)先級(jí):
buildVariant > buildType > buildFlavor> main > 庫(kù)依賴項(xiàng)
總結(jié)
以上是生活随笔為你收集整理的flavor android build,android BuildType和BuildFlavor的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android 手机号码去重,第135天
- 下一篇: C语言编写Scheme解释器,C语言编写