gradle 在开发中的运用

1,449 阅读2分钟
原文链接: www.diycode.cc

移动端开发过程中会用到至少两套不同环境,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并不匹配了 -_- ! ,由于时间关系,这种也放弃了