移动端开发过程中会用到至少两套不同环境,release 和 debug ,绝大部分开发者基本都是使用gradle生成 的 BuildConfig 中的 Debug 值来切换服务器
通常情况下,这就能满足大部分的需求,debug 用于开发环境,而release只用于最终上线打包,基本不需改动
但在实际情况可能更复杂,服务端会有多套环境,线上环境、测试环境、开发环境,为了保证测试时的稳定性,可能会单独有一套环境专门用来测试。
这时 BuildConfig.Debug 就满足不了我们的需求了
BuildConfig 提供了自定义属性的方法 buildConfigField "String", "SERVER_CFG", "\"${SERVER_TYPE}\"" //是否测试版本
通过在build.gradle 中自定义一个变量区分不同服务器,这种方式能够解决多套服务器地址切换的问题。
开发时只需修改成相应的值即可
buildTypes {
release {
buildConfigField "String", "SERVER_CFG", "release" //是否测试版本
}
debug {
buildConfigField "String", "SERVER_CFG", "debug" //是否测试版本
}
}
到这里基本能解决绝大部分人的问题
但在我们项目中还存在一个比较奇葩的问题,项目有涉及实时通信,而服务器地址也打包在通信库中,服务器地址配置在assets 目录下的一个txt 文件中,每次打不同环境的包的同时,还要去修改 txt文件中的值,所以每次都需要修改多个地方,暂且不论这种设计方式的好坏,但在打包过程中,这种设置增加了出错的可能性。
先给出现在的解决方案
在 gradle.pro 中增加配置选项,之所以这么做是因为现有项目是之前eclipse项目导入的,并不是标准的gradle结构,所以只有一个build.gradle 文件,而且每次修改gradle文件都需要同步,哪怕多了一个空格。所以目前选择时在gradle.pro中增加服务器配置
在build.gradle 中引用
buildTypes {
release {
buildConfigField "String", "SERVER_CFG", "\"${SERVER_TYPE}\"" //是否测试版本
}
debug {
buildConfigField "String", "SERVER_CFG", "\"${SERVER_TYPE}\"" //是否测试版本
// formal 正式
// prepare 测试
// local 本地开发
}
}
此时打不通服务器的包,只需要修改gradle.pro 中的配置即可,不需要修改build.gradle 文件
修改推送服务器
task modifyServerCfg <<{
def assetDir= new File(project.projectDir.absolutePath+"/assets")
if(!assetDir.exists()){
assetDir.mkdirs()
}
def serverCfgDir=new File(assetDir.absolutePath+"/serverCfg.txt")
if(!serverCfgDir.exists()){
serverCfgDir.createNewFile()
}
serverCfgDir.text=SERVER_TYPE
}
preBuild.dependsOn modifyServerCfg
在build 任务之前插入一个新task 用来修改assets目录下 推送配置文件,这样省去了每次要修改多个地方的问题
目前项目中的url 都是写死在代码了 通过SERVER_TYPE来区分的,所以可以用一个变量来区分。
打包之前只需修改 gradle.pro 中的变量值即可
SERVER_TYPE=formal
在此之前对于gradle的了解不是很多,而且网上资料都是介绍android gradle 的最基本配置,而gradle的文档非常长,翻译也很少,最初考虑在build.gradle 中使用 buildConfigFiled,但是搜索了很多资料后发现 这玩意是在gradle中设置,使用只能是在代码中使用 通过BuildConfig 获取,这样就不能gradle文件中获取它的值了。
初次之外,在测试时我使用的是一个标准的studio项目,通过不同buildType 来设置推送地址
tasks.whenTaskAdded { task ->
if (task.name == 'assembleDebug') {
changePushServer("prepare")
}
if(task.name =='assembleRelease') {
changePushServer("formal")
}
}
测试项目中运行正常
但是移到我们的项目中发现 task并不匹配了 -_- ! ,由于时间关系,这种也放弃了