背景
调试的时候切换环境地址,比如debug环境下走开发地址,release环境下走生产地址,或者是debug调试代码环境下调试生产地址,等等。
怎么统一切换地址呢
怎么管理我们的地址呢,来了一个傻瓜都会管理那种。
其实工程中支持这么做的,应该很多同学知道这个操作。
buildConfigField
就是这个玩意。
这个东西编译之后会在BuildConfig.java
中生成一些属性。
举个例子吧。
比如:
buildConfigField "String", "APP_BASE_URL", BASE_LLL_URL
在对应的模块的BuildConfig中就有APP_BASE_URL这个字段。
好吧,那就简单的开始。
配置BuildConfig
通常我们配置的时候直接分开配置就行了,比如buildTypes:release中配置生产地址,buildTypes:debug中配置开发地址,buildTypes:uat配置模拟地址,设置其他环境。
这是一种方式。也就是你在编译的时候去build variants中选择你需要的模式。
选择之后打包即可。这个是常规操作。
今天说的是我现在的方式,统一配置,通过一个总配置来切换地址。
开关切换环境 -> 映射至全局配置ext中 -> 子模块读取全局配置,切换环境。
总开关
gradle.properties中编写
build_channel=1
module_login_dev_url="http://www.fdadf.sfa"
module_login_release_url="http://www.fdadf.eeee"
//还有其他模块配置,这里省略了
比如1是dev,2是release等等,自己约定。
在项目根build.gradle文件中,读取gradle.properties中的数据,当然肯定这里配置了很多数据。
root:build.gradle
buildscript{
/**
* 读取properties中的属性返回.
*/
def getLocalPropertyString = { key ->
// System.getenv 获取系统环境变量;getProperties 获取当前系统环境变量
String value = System.getenv(key)
if (!value) {
try {
def properties = new Properties()
properties.load(new FileInputStream(file("gradle.properties")))
value = properties.getProperty(key, "")
//println("value: " + value)
} catch (Exception e) {
e.printStackTrace()
}
}
return value
}
//全局常量配置
ext {
//获取模式,1dev,2正式环境
buildChannel = getLocalPropertyString("build_channel")
//这里的字段全局可用,子模块的buildField属性注入.主要是各种业务的地址
login_base_url = ""
sys_config_url = ""
if ("1" == buildChannel) {
println("准备dev环境的数据...")
login_base_url = getLocalPropertyString("module_login_dev_url")
sys_config_url = getLocalPropertyString("sys_config_dev_url")
} else if ("2" == buildChannel) {
println("准备release环境的数据...")
login_base_url = getLocalPropertyString("module_login_release_url")
sys_config_url = getLocalPropertyString("sys_config_release_url")
}
//这里可以继续其他配置,根据上面的数据自己继续增加配置
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.2"
}
}
数据读取完成了,所有模块都能取这里ext的数据。
子模块的build.gradle中配置数据。
defaultConfig:中,这次我们配置默认中,不跟随build
Types。
defaultConfig {
buildConfigField "String", "SYS_CONFIG_URL", sys_config_url
buildConfigField "String", "LOGIN_BASE_URL", login_base_url
}
其他子模块同理,需要什么数据,直接从根配置ext中取就行了。
当配置完成之后,同步一次gradle,还不行。需要点击菜单的build,选择rebuild一次项目。
在子模块中使用BuildConfig.xxx就可以访问刚刚配置的常量了。
比如我的配置。
当我们切换build channel之后,也是需要rebuild。
环境配置,(其实是任何需要动态更新)都可以这样配置,好处,通过代码切换环境,我们只需要关心定义好的数据就行了,而不是在我们的代码中随机散落,认为一处处修改可能会遗漏,或者改错,甚至打包的时候把dev的配置到到release中去,我也做过这种事情。
完
这个buildConfigField属性对应的api比较稳定,不用担心plugin会更新,大家如果有这样的场景可以用上。