在開發過程中,難免會有兩套或者更多的環境(測試環境和正式環境等)。針對不同的環境,手動來回切換難免是一件很麻煩的事情,并且還可以有遺漏。打包的結果,也需要根據不同的環境,來實現不同的命名。現在介紹一下使用build.gradle來配置不同渠道來實現環境的快速切換。
參考
Gradle的高級技巧 http://www.lxweimin.com/p/cc98a6b4f52e
Android Studio 3.0的新特性與適配 http://www.lxweimin.com/p/a0d040615c2c
思路
- 在build.gradle中配置BuildConfig:BUILD_ENV_TYPE(編譯環境類型:測試環境和正式環境),BASE_URL(服務器的地址)
- 在build.gradle中配置多渠道:測試環境和正式環境兩種渠道
- 在build.gradle中配置打包后的文件命名:區分測試環境和正式環境
- 在Application中直接獲取BASE_URL,根據BUILD_ENV_TYPE來設置測試環境和正式環境的端口地址
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的時候也根據該規則來打包,導致build/output/apk/下有很多apk,就再加上這個判斷
&& !variant.getBuildType().isDebuggable()
build project
設置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";;
}
設置Application
- 設置服務器地址為BuildConfig.BASE_URL
- 設置端口
根據不同的**BUILD_ENV_TYPE **來設置不同的端口號
switch (BuildConfig.BUILD_ENV_TYPE) {
case "pro":
// 設置正式環境的端口
break;
case "dev":
// 設置測試環境的端口
break;
}
使用
- 快速切換環境
可以點擊Build Variants -> app -> Build Variant來選擇不同的環境:
image.png - 打包
為了更好區分打出的包是測試環境還是正式環境,可以在包名加標識,如01||02。01代表測試環境,02代表正式環境。
此處選擇將兩種環境的都打出。
image.png
打包結果
image.png