版本構(gòu)建
在app開發(fā)過程中,你通常需要兩個辦法的apk,一個debug版本,用于開發(fā),一個release版本用于發(fā)布。debug版本在你程序運行的時候,android studio會自動幫你生成,輸出目錄在app/build/outputs/apk下,而release版本,as也會幫你加上默認(rèn)配置。
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
當(dāng)然這些遠(yuǎn)遠(yuǎn)是不夠的,起碼你還得加上下面這些配置。
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下的版本是組合的形式構(gòu)建的。
比如
buildTypes下有 debug,release,newtype
productFlavors下有 flavorA,flavorB。
最后一個會有6種類型的版本變體
flavorAdebug,flavorArelease,flavorAnewtype
flavorBdebug,flavorBrelease,flavorBnewtype,
具體刻在下圖位置處查看
資源文件和manifest的合并
既然創(chuàng)建了多個不同的版本,那必然是因為在各個版本有不同的需求,這勢必會帶來資源文件和manifest的修改,在編譯合并的時候如果處理不當(dāng),就會引起沖突。
gradle有一套資源文件和manifest合并的規(guī)則,
優(yōu)先級從高到低,
1.buildType的配置
2.productFlavor的配置
3.src/main目錄下的manifest文件
4.依賴和第三方庫
合并規(guī)則
能合并則合并,沖突則取高優(yōu)先級,顯示設(shè)置的屬性高于默認(rèn)的屬性
簡單解釋一下,
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)
}
}
}
}
}
}
上述代碼打包輸出的結(jié)果是這樣的。
簽名配置
簽名配置就比較常見了
配置
signingConfigs {
release {
storeFile file("test.jks")
storePassword 'gank666'
keyAlias 'Gank'
keyPassword '94a186'
}
}
使用
buildTypes {
release {
signingConfig signingConfigs.release
}
}
本人也只是Android開發(fā)路上一只稍大一點的菜鳥,如果各位讀者中發(fā)現(xiàn)文章中有誤之處,請幫忙指出,你的批評和鼓勵都是我前進的動力。