在开发过程中,难免会有两套或者更多的环境(测试环境和正式环境等)。针对不同的环境,手动来回切换难免是一件很麻烦的事情,并且还可以有遗漏。打包的结果,也需要根据不同的环境,来实现不同的命名。现在介绍一下使用build.gradle来配置不同渠道来实现环境的快速切换。
参考
Gradle的高级技巧 https://www.jianshu.com/p/cc98a6b4f52e
Android Studio 3.0的新特性与适配 https://www.jianshu.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来选择不同的环境:
- 打包
为了更好区分打出的包是测试环境还是正式环境,可以在包名加标识,如01||02。01代表测试环境,02代表正式环境。
此处选择将两种环境的都打出。
打包结果