Gradle Build Files in Android 第三章
了解Build Types 和 Flavors
3.1 了解Build Types
-
debug和release
Gradle Android 插件提供了兩種build類型,debug和release,他們兩者都可以在
buildTypes節(jié)點中配置。例如默認配置:buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }同樣可以直接加入
debugtype ,兩者配置都可以一樣,這是用來區(qū)分打包類型。并且debug 默認 debuggable 為true。 -
minifyEnabled,shrinkResources
開發(fā)很久的項目中通常會存在很多已經不再使用的資源文件,但是人工去刪除又比較麻煩,可以使用這兩個幫助刪除不再使用的資源文件。
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), Turn on code shrinking 'proguard-rules.pro' } } }這兩個屬性已經要同時設置才能生效。
-
設置后綴的屬性
為了方便辨別打包后的包是release或debug,可以根據(jù)不同的打包類型設置區(qū)分。如修改版本名稱,修改包名。
android { // ... other properties ... buildTypes { debug { applicationIDsuffix '.debug' versionNameSuffix '-debug' } // .. other build types ... } }這樣配置后打包的debug包的包名會在后面增加
.debug,版本名后也會相應的增加-debug,這樣一個手機上可以很方便安裝多個包。
3.2 Flavors and Variants
問題
如何做到不同一次build同一個APP不同版本功能的包。
解決方法
productFlavors用于build不同版本的包,他可能用于免費版,收費版,但是基于代碼是一樣的,只是有個別屬性是不一樣的。
例如
productFlavors {
baidu {
applicationId 'com.branch.www.gradledemo.baidu'
}
meizu {
applicationId 'com.branch.www.gradledemo.meizu'
}
wandoujia {
applicationId 'com.branch.www.gradledemo.wandoujia'
}
然后在build apk時可以選擇需要的構建

-
每一個構建中可以定義自己的屬性,所有的屬性基于
defaultConfig- applicationId
- minSdkVersion
- targetSdkVersion
- versionCode
- versionName
- signingConfig
-
每一個構建都可以有他自己的
source和resource,如下:- app/src/baidu/java
- app/src/meizu/java
- app/src/wandoujia/java
或
- app/src/baidu/res
- app/src/meizu/res/layout
- app/src/wandoujia/res/values
如:
productFlavors_2.png或 不共用源碼
productFlavors_3.png -
使用manifestPlaceholders
同時我們在常用的不同渠道號的apk中有渠道區(qū)分或者其他需要在
AndroidManifest.xml中設置的。defaultConfig { applicationId "com.branch.www.gradledemo" minSdkVersion 18 targetSdkVersion 24 versionCode versionCodes versionName versionNames manifestPlaceholders = [BaiduMobAd_CHANNEL: "common", xxx: "xx"] } flavorDimensions 'one', 'two' productFlavors { baidu { manifestPlaceholders = [BaiduMobAd_CHANNEL: "baidu", xxx: "xx"] dimension "one" // applicationId 'com.branch.www.gradledemo.baidu' } meizu { manifestPlaceholders = [BaiduMobAd_CHANNEL: "meizu", xxx: "xx"] resValue "string", "app_name", "魅族" dimension "one" applicationId 'com.branch.www.gradledemo.meizu' }則可以這樣使用它
<meta-data android:name="BaiduMobAd_CHANNEL" android:value="${BaiduMobAd_CHANNEL}" /> -
使用resValue
meizu { resValue "string", "xxx_name", "魅族" dimension "one" applicationId 'com.branch.www.gradledemo.meizu' }使用時同樣也是R.string.app_xxx_name,跟在
string.xml中定義是一樣的。
3.3 Merging Resources
問題
想要根據(jù)不同構建設置不懂的text,image等
解決方法
參照 3.2 ,每個構建都可以有自己的source和resource,則可以很方面的設置,這里就不再重復驗證。
3.4 Flavor Dimensions 的使用
問題
或許 3.2 Flavors還不夠用,還可以增加,或有太多相同的可以合并。
解決方法
使用 ?flavor dimensions 合并baidu,meizu,wandoujia ,如:
flavorDimensions 'one', 'two'
productFlavors {
baidu {
dimension "one"
// applicationId 'com.branch.www.gradledemo.baidu'
}
meizu {
dimension "one"
applicationId 'com.branch.www.gradledemo.meizu'
}
wandoujia {
dimension "two"
applicationId 'com.branch.www.gradledemo.wandoujia'
}
one {
dimension "two"
}
two {
dimension "two"
}
然后build是就有1x3+1x3=6個包可以選擇。

定義了flavorDimensions后每一個構建都需要加上dimension否則報錯

與3.2 一樣,可以設置屬性,同樣可以合并相同的。
3.5 Merging Java Sources Across Flavors
問題
怎么改變源碼或其他java類
解決方法
在3.2中創(chuàng)建不同構建對應的文件夾
resources可以自動覆蓋,并且可以有相同或不相同的而java類有點不一樣,java類不能有和main中存在一樣的,并且需要從main跳轉的在每一個構建中都要存在,但是他們每一個的實現(xiàn)可以不一樣。
例如:

可以看到one,two是組合構建

所以不所有包中都會有一個OtherActivity,并且他們的實現(xiàn)方式不一樣。從main中的MainActivity 實現(xiàn)startActivity時,不同構建跳轉到對應的構建。應該在每一個構建中自己的實現(xiàn)也就實現(xiàn)完全不一樣。