版本構建
在app開發(fā)過程中,你通常需要兩個辦法的apk吁津,一個debug版本,用于開發(fā),一個release版本用于發(fā)布冀值。debug版本在你程序運行的時候,android studio會自動幫你生成搁吓,輸出目錄在app/build/outputs/apk下各聘,而release版本,as也會幫你加上默認配置她渴。
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
當然這些遠遠是不夠的达址,起碼你還得加上下面這些配置。
zipAlignEnabled true
//刪除無效的Resource
shrinkResources true
一般情況下趁耗,debug版本加上release版本就能滿足需求了沉唠,不過遇到一些特殊的需求,那你可能需要自己定義版本苛败。如下
android {
buildTypes {
//繼承debug版本的所有屬性
newtype.initWith(buildTypes.debug)
newtype {
//定義新的applicationId
applicationIdSuffix ".newtype"
}
}
}
這樣就創(chuàng)建了一個新的版本newtype满葛,同時定義了一個新的application径簿。
debug-applicationid:com.package
release-applicationid:com.package
newtype-application:com.package.newtype
意思就是說,你在手機上不能同時安裝debug版本和release版本嘀韧,
但是你可以同時安裝release版本和newtype版本篇亭,原因是applicationid不同。
Product Flavors
Product Flavors姑且理解為版本變種的意思锄贷,就是說你的一個release版本译蒂,也可以有releaseA,releaseB兩種版本谊却。
基本的使用柔昼。
android {
productFlavors {
flavorA {
applicationId 'com.package.flavorA'
versionCode 3
versionName "1.0-demo"
}
flavorB {
applicationId 'com.package.flavorA'
minSdkVersion 14
versionCode 4
versionName "2.0-demo"
}
}
}
上述代碼定義了flavorA和flavorB兩種變體,而productFlavors下的變體和buildTypes下的版本是組合的形式構建的因惭。
比如
buildTypes下有 debug岳锁,release,newtype
productFlavors下有 flavorA蹦魔,flavorB激率。
最后一個會有6種類型的版本變體
flavorAdebug,flavorArelease勿决,flavorAnewtype
flavorBdebug乒躺,flavorBrelease,flavorBnewtype低缩,
具體刻在下圖位置處查看
資源文件和manifest的合并
既然創(chuàng)建了多個不同的版本嘉冒,那必然是因為在各個版本有不同的需求,這勢必會帶來資源文件和manifest的修改咆繁,在編譯合并的時候如果處理不當讳推,就會引起沖突。
gradle有一套資源文件和manifest合并的規(guī)則玩般,
優(yōu)先級從高到低银觅,
1.buildType的配置
2.productFlavor的配置
3.src/main目錄下的manifest文件
4.依賴和第三方庫
合并規(guī)則
能合并則合并,沖突則取高優(yōu)先級坏为,顯示設置的屬性高于默認的屬性
簡單解釋一下究驴,
A版本
<resources>
<string name="app_name">A</string>
<string name="hello_world">Hello world!</string>
</resources>
B版本
<resources>
<string name="app_name">B</string>
<string name="hello">Hello</string>
</resources>
合并之后
<resources>
<string name="app_name">?</string> //?匀伏?洒忧?
<string name="hello_world">Hello world!</string>
<string name="hello">Hello</string>
</resources>
帶???那行,因為屬性相同都是app_name够颠,所以會起沖突熙侍,這個時候就需要按照優(yōu)先級高低來合并屬性了。
變體過濾
有的時候你需要忽略某些版本變體,這個時候你可以這么寫
buildTypes {
android.variantFilter { variant ->
if(variant.buildType.name.equals('release')) {
variant.getFlavors().each() { flavor ->
if (flavor.name.equals('flavorsA')) { variant.setIgnore(true);
}
}
}
}
}
上述代碼表示核行,忽略flavorsArelease這個變體牢硅。
定義變體的輸出樣式
buildTypes {
android.variantFilter { variant ->
if(variant.buildType.name.equals('release')) {
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "test_v${defaultConfig.versionName}_${releaseTime()}_${variant.flavorName}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
}
上述代碼打包輸出的結果是這樣的。
簽名配置
簽名配置就比較常見了
配置
signingConfigs {
release {
storeFile file("test.jks")
storePassword 'gank666'
keyAlias 'Gank'
keyPassword '94a186'
}
}
使用
buildTypes {
release {
signingConfig signingConfigs.release
}
}
本人也只是Android開發(fā)路上一只稍大一點的菜鳥芝雪,如果各位讀者中發(fā)現(xiàn)文章中有誤之處,請幫忙指出综苔,你的批評和鼓勵都是我前進的動力惩系。