在開發(fā)過程中,難免會有兩套或者更多的環(huán)境(測試環(huán)境和正式環(huán)境等)。針對不同的環(huán)境,手動來回切換難免是一件很麻煩的事情,并且還可以有遺漏。打包的結(jié)果,也需要根據(jù)不同的環(huán)境,來實現(xiàn)不同的命名?,F(xiàn)在介紹一下使用build.gradle來配置不同渠道來實現(xiàn)環(huán)境的快速切換。
參考
Gradle的高級技巧 http://www.itdecent.cn/p/cc98a6b4f52e
Android Studio 3.0的新特性與適配 http://www.itdecent.cn/p/a0d040615c2c
思路
- 在build.gradle中配置BuildConfig:BUILD_ENV_TYPE(編譯環(huán)境類型:測試環(huán)境和正式環(huán)境),BASE_URL(服務(wù)器的地址)
- 在build.gradle中配置多渠道:測試環(huán)境和正式環(huán)境兩種渠道
- 在build.gradle中配置打包后的文件命名:區(qū)分測試環(huán)境和正式環(huán)境
- 在Application中直接獲取BASE_URL,根據(jù)BUILD_ENV_TYPE來設(shè)置測試環(huán)境和正式環(huán)境的端口地址
build.gradle
- 配置BuildConfig
在defaultConfig中配置
buildConfigField('String', 'BUILD_ENV_TYPE', '"dev"')
buildConfigField('String', 'BASE_URL', '"http://dev.domain.com"')
- 配置多渠道
productFlavors {
devEnveriment {
buildConfigField('String', 'BUILD_ENV_TYPE', '"dev"')
buildConfigField('String', 'BASE_URL', '"http://dev.domain.com"')
}
proEnveriment {
buildConfigField('String', 'BUILD_ENV_TYPE', '"pro"')
buildConfigField('String', 'BASE_URL', '"http://pro.domain.com"')
}
}
- 配置輸出文件重命名
//重命名apk
applicationVariants.all {
variant ->
variant.outputs.each {
output ->
if (output.outputFile != null
&& output.outputFile.name.endsWith('.apk')) {
def date = new Date().format("yyyyMMdd", TimeZone.getTimeZone("GMT+08"))
// 渠道名
def flavorName = variant.flavorName
// 文件名前綴
def startName = "app_${flavorName == 'devEnveriment' ? '01' : '02'}"
// 文件名后綴
def endName = "_${date}_${versionName}_${versionCode}.apk"
def apkFile = new File(output.outputFile.getParent(), startName + endName)
output.outputFile = apkFile
}
}
}
- 如果不想debug的時候也根據(jù)該規(guī)則來打包,導(dǎo)致build/output/apk/下有很多apk,就再加上這個判斷
&& !variant.getBuildType().isDebuggable()
build project
設(shè)置build.gradle后,build一下project,是的BuildConfig能夠生成。
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.xxx.xxx";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "devEnveriment";
public static final int VERSION_CODE = 3;
public static final String VERSION_NAME = "v1.0.2";
// Fields from product flavor: devEnveriment
public static final String BASE_URL = "http://dev.domain.com";
public static final String BUILD_ENV_TYPE = "dev";;
}
設(shè)置Application
- 設(shè)置服務(wù)器地址為BuildConfig.BASE_URL
- 設(shè)置端口
根據(jù)不同的**BUILD_ENV_TYPE **來設(shè)置不同的端口號
switch (BuildConfig.BUILD_ENV_TYPE) {
case "pro":
// 設(shè)置正式環(huán)境的端口
break;
case "dev":
// 設(shè)置測試環(huán)境的端口
break;
}
使用
- 快速切換環(huán)境
可以點擊Build Variants -> app -> Build Variant來選擇不同的環(huán)境:
image.png - 打包
為了更好區(qū)分打出的包是測試環(huán)境還是正式環(huán)境,可以在包名加標(biāo)識,如01||02。01代表測試環(huán)境,02代表正式環(huán)境。
此處選擇將兩種環(huán)境的都打出。
image.png
打包結(jié)果
image.png


