很多時(shí)候我們會(huì)有這樣一個(gè)需求澄港,版本迭代中當(dāng)前版本的開發(fā)和改bug工作已經(jīng)基本完畢,進(jìn)入后臺(tái)api切換到線上環(huán)境的測(cè)試階段进栽,這時(shí)候我們需要修改app代碼的情況已經(jīng)不多雷滋,后臺(tái)api的童鞋可能需要切換不同的環(huán)境做調(diào)試,而安裝不同環(huán)境app的測(cè)試設(shè)備數(shù)量是有限的种吸,所以最好能在一部測(cè)試設(shè)備上安裝幾個(gè)連接不同環(huán)境的apk弃衍,而且是同一個(gè)應(yīng)用程序,只是包名不同坚俗。
進(jìn)入正題镜盯。首先在module的build.gradle中配置幾個(gè)productFlavor:
android{
....
productFlavors {
releaseOnline {
buildConfigField "int", "USE_SERVER", "0"
}
manualConfig {
buildConfigField "int", "USE_SERVER", "0"
}
debug239 {
applicationIdSuffix ".debug239" //定義不同包名,這一個(gè)productFlavor安裝后的包名是com.fenlibao.fenlibao.debug239
buildConfigField "int", "USE_SERVER", "1" //自定義一個(gè)全局常量猖败,用來讀取不同配置
}
debug236 {
applicationIdSuffix ".debug236"
buildConfigField "int", "USE_SERVER", "2"
}
debugtem {
applicationIdSuffix ".debugtem"
buildConfigField "int", "USE_SERVER", "3"
}
}
....
}
其中定義applicationIdSuffix的作用是加后綴區(qū)分包名速缆,沒有指定applicationIdSuffix的則沿用原來的包名com.fenlibao.fenlibao。USE_SERVER的作用是為指定連接不同的服務(wù)器(環(huán)境)恩闻。定義了productFlavors之后就可以在Studio編輯界面的左側(cè)找到Build Variants面板艺糜,指定當(dāng)前app module的build variant(productFlavor + buildType),每一個(gè)productFlavor編譯后對(duì)USE_SERVER單獨(dú)賦值幢尚。
然后為了區(qū)分不同的環(huán)境破停,在手機(jī)上能夠一眼就辨認(rèn)出哪一個(gè)包連接的是哪一個(gè)環(huán)境,還需要改一下應(yīng)用名尉剩,例如連接236測(cè)試環(huán)境的真慢,就把應(yīng)用名命名為debug236,這個(gè)又怎么實(shí)現(xiàn)呢理茎?
在src目錄下創(chuàng)建目錄debug236黑界,再在debug236下創(chuàng)建目錄res,然后在res下創(chuàng)建Android resource directory
Source set選擇debug236皂林,目錄名values
在里面創(chuàng)建appname.xml朗鸠,寫上對(duì)應(yīng)的應(yīng)用名
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">debug236</string>
</resources>
同時(shí),我還希望不同的productFlavor打出來的包以相應(yīng)的productFlavor作為后綴命名础倍,那么在build.gradle里面可以這樣配置:
android{
....
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if(variant.buildType.name.equals('release')){
def fileName = "fenlibao_V${defaultConfig.versionName}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
if(variant.buildType.name.equals('debug')){ //此處為debug版本配置不同的命名
def fileName = "fenlibao_V${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
....
}
最后在讀取連接服務(wù)器的配置時(shí)烛占,根據(jù)當(dāng)前productFlavor連接不同的服務(wù)器地址:
//0.239_測(cè)試環(huán)境;1.236_new測(cè)試環(huán)境;2.236_測(cè)試環(huán)境;3.212_測(cè)試環(huán)境;4.準(zhǔn)現(xiàn)網(wǎng);5.生產(chǎn)環(huán)境;
private static final int SERVER = getServer();
private static int getServer(){
if("release".equals(BuildConfig.BUILD_TYPE)){//release版本,連接線上環(huán)境
return 5;
}
if(BuildConfig.USE_SERVER == 1){//連接239
return 0;
}else if(BuildConfig.USE_SERVER == 2){//連接236
return 1;
}else if(BuildConfig.USE_SERVER == 3){//連接準(zhǔn)現(xiàn)網(wǎng)
return 4;
}
return 1;
}
展示一下成果: