一邑蒋、構(gòu)建變體
1. BuildType
1.1 默認BuildType
默認情況下,Android plugin會自動的構(gòu)建release和debug兩個版本
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
}
}
// release版本中設(shè)置了開啟混淆妓羊,并且定義了混淆文件的位置
release和debug的差異主要在于是否可以在設(shè)備上調(diào)試應(yīng)用以及APK如何簽名。
- debug 版本會被使用已知的名稱/密碼自動生成的密鑰/證書簽名冯丙。
- release 版本在構(gòu)建過程中不會被簽名吏恭,需要構(gòu)建后再簽名。
1.2 自定義BuildType
Android plugin允許自定義這兩個示例扬虚,并且可以創(chuàng)建其他的buildType,如下:
buildTypes {
debug {
minifyEnabled false
applicationIdSuffix ".debug"
}
custom.initWith(buildTypes.debug)
custom {
applicationIdSuffix ".custom"
versionNameSuffix "-customs"
}
}
-
上述配置進行了一下設(shè)置
- 對默認的debug構(gòu)建類型進行了修改球恤,關(guān)閉了混淆配置辜昵,添加applicationId后綴
- 以debug為基礎(chǔ)創(chuàng)建一個叫custom的構(gòu)建類型(相當(dāng)于繼承了debug版本),在custom的構(gòu)建類型中修改applicationId后綴咽斧,并添加了versionName的后綴
-
創(chuàng)建一個新的BuildType的步驟為:
- 在buildTypes容器下添加一個自定義名稱的元素
- 調(diào)用initWith或者使用閉包進行配置點擊查看BuildType的可配置屬性
對于每一個BuildType堪置,Android plugin都會創(chuàng)建對應(yīng)的“assembleBuildTypeName”任務(wù)
對于每一個BuildType躬存,都可以在dependencies容器中添加名為BuildTypeNameCompile的依賴配置
-
對于每一個BuildType,Android plugin都會創(chuàng)建一個對應(yīng)的sourceSet舀锨,默認位置為:src/BuildTypeName
所以新建BuildType的名字不能是main岭洲、androidTest和test這三個已經(jīng)被用的名字
BuildType的代碼/資源會以以下方式進行合并- manifest會被合并到app的manifest文件中
- res目錄下的資源文件會替換main里的資源文件
- java目錄下的文件會被添加到main里的java目錄中,所以不能和main里的類重名(含包名)
2. ProductFlavor
2.1 單維度的ProductFlavor
ProductFlavor定義了通過工程構(gòu)建應(yīng)用的自定義版本坎匿。一個獨立的工程可以定義不同的flavor改變生成的應(yīng)用盾剩。
創(chuàng)建方式:
productFlavors {
flavor1 {
minSdkVersion 10
versionCode 1
}
flavor2 {
minSdkVersion 14
versionCode 2
}
}
-
上述配置進行了以下設(shè)置
- 新建了兩個ProductFlavors,名字分別為flavor1和flavor2
- 重新設(shè)置了minSdkVersion和versionCode
-
創(chuàng)建一個新的ProductFlavor的步驟為:
- 在productFlavors容器下添加一個自定義名稱的元素
- 使用閉包進行配置
2.2 多維度的ProductFlavor
某些情況下替蔬,我們需要從多個維度來區(qū)分app的版本告私,比如渠道和是否付費,只是我們就需要創(chuàng)建多維度的ProductFlavor來生成不同的apk承桥。
創(chuàng)建方式:
flavorDimensions "channle", "version"
productFlavors {
huawei {
dimension "channle"
}
xiaomi {
dimension "channle"
}
free {
dimension "version"
}
paid {
dimension "version"
}
}
-
上述配置進行了以下設(shè)置
- flavorDimensions定義了可能用到的維度和順序
- 新建了四個ProductFlavor驻粟,每一個ProductFlavor都指定了一個維度
-
創(chuàng)建多維度的ProductFlavor的步驟為:
- 使用flavorDimensions定義維度和順序
- 在productFlavors容器下添加一個自定義名稱的元素
- 使用閉包進行配置,必須指定ProductFlavor的維度點擊查看ProductFlavor的可配置項
對于每一個ProductFlavor凶异,Android plugin都會創(chuàng)建對應(yīng)的“assembleProductFlavorNameDebug”和“assembleProductFlavorNameRelease”任務(wù)
對于每一個ProductFlavor蜀撑,都可以在dependencies容器中添加名為ProductFlavorNameCompile的依賴配置
-
類似BuildType,Android plugin也會為ProductFlavor創(chuàng)建對應(yīng)的sourceSet剩彬,默認的位置為:src/ProductFlavorName
所以ProductFlavor的名字不能和已存在的BuildType的名字沖突
ProductFlavor的代碼/資源會以以下方式進行合并- manifest會被合并到app的manifest文件中
- res目錄下的資源文件會替換main里的資源文件
- java目錄下的文件會被添加到main里的java目錄中酷麦,所以不能和main里的類重名(含包名)
3. BuildVariant
BuildType和ProductFlavor相結(jié)合,組成了構(gòu)建變體襟衰。每創(chuàng)建一個buildType或productFlavor贴铜,都會同時創(chuàng)建相應(yīng)的變體。
3.1 單維度ProductFlavor時產(chǎn)生的BuildVariant
例如:
buildTypes {
debug {
minifyEnabled false
applicationIdSuffix ".debug"
}
custom.initWith(buildTypes.debug)
custom {
applicationIdSuffix ".custom"
versionNameSuffix "-customs"
}
}
productFlavors {
flavor1 {
minSdkVersion 10
versionCode 1
}
flavor2 {
minSdkVersion 14
versionCode 2
}
}
上述配置的情況下會產(chǎn)生6個BuildVariant:
- flavor1Debug
- flavor1Release
- flavor1Custom
- flavor2Debug
- flavor2Release
- flavor2Custom
3.2 多維度ProductFlavor時產(chǎn)生的BuildVariant
如果是多維度的ProductFlavor瀑晒,例如:
buildTypes {
debug {
minifyEnabled false
applicationIdSuffix ".debug"
}
custom.initWith(buildTypes.debug)
custom {
applicationIdSuffix ".custom"
versionNameSuffix "-customs"
}
}
flavorDimensions "channle", "version"
productFlavors {
huawei {
dimension "channle"
}
xiaomi {
dimension "channle"
}
free {
dimension "version"
}
paid {
dimension "version"
}
}
上述配置的情況下會產(chǎn)生12個BuildVariant:
- huaweiFreeDebug
- huaweiFreeRelease
- huaweiFreeCustom
- huaweiPaidDebug
- huaweiPaidRelease
- huaweiPaidCustom
- xiaomiFreeDebug
- xiaomiFreeRelease
- xiaomiFreeCustom
- xiaomiPaidDebug
- xiaomiPaidRelease
- xiaomiPaidCustom
3.3 BuildVariant的使用
對于每一個BuildVariant绍坝,Android plugin都會創(chuàng)建對應(yīng)的“assembleBuildVariantName”任務(wù)
-
BuildVariant的sourceSet合并規(guī)則:
- 所有的manifest會被合并到一個manifest文件中
- res目錄下的資源文件會遵循優(yōu)先級覆蓋的原則:
- BuildType會覆蓋ProductFlavor
- flavorDimensions中定義維度是的順序,決定了ProductFlavor之間資源覆蓋的順序苔悦,順序在在前的優(yōu)先級越高轩褐,高優(yōu)先級會覆蓋低優(yōu)先級的資源
- ProductFlavor會覆蓋main的資源文件
- java目錄下的文件會被添加到main里的java目錄中,如果所選的BuildVariant中BuildType和ProductFlavor對應(yīng)的sourceSet中有同名的類玖详,則會編譯不通過