一、问题:在平时开发中经常会对某些项目状态进行变更,通过debug状态来区分环境,代码里通过BuildConfig,但gradle里却没有类似的方法,下面演示了如何在gradle文件里自定义一个字段实现状态切换(主要是groovy不够熟悉)
- 例如Android文件里判断环境:
if (BuildConfig.DEBUG) {
// TODO: xxx
}else{
// TODO: xxx
}
以上情况在代码里使用确实很方便,但如果转移到build.gradle
里,比如输出版本类型,就只有在buildTypes
里通过自定义buildConfigField来配置不同版本类型的versionName
了
- 在gradle里辨别环境
android.applicationVariants.all { variant ->
println("${variant.name}-${variant.versionName}-${variant.versionCode}}.apk")
}
二、解决:在gradle里自定义字段实现一键切换
碍于麻烦,每次打包要去多处修改版本号,于是给统一到另一个config.gradle
统一管理,这样便于打包前修改,例如我想通过一个boolean值控制是否输入dev信息:
/**
* 获取当前APP打包版本号
* debug版本有dev后缀
* @return 经过debug和release 区分后的versionName
*/
def getVersionName(){
for (def property : getProperties()){
System.out.println("日志------>>> ${property.key} : ${property.value}")
}
def versionType = hasProperty("isReleaseVersion") ? isReleaseVersion : ext.isReleaseVersion as boolean
return versionType ? "1.0.0" : "1.0.0dev"
}
ext {
// 1.appConfig
complileSdkVersion = 29
minSdkVersion = 21
targetSdkVersion = 29
// FIXME: 2020/8/19 打apk前需要修改[isReleaseVersion]为需要的值
isReleaseVersion = Boolean.TRUE // 是否打正式包信息, debug:false release:true
versionCode = 1
// 注意:方法调用不能放在属性上面,否则方法里会报找不到属性名
versionName = getVersionName()
// 2.dependencies
dependencies =
[
"key" : "value"
]
}
在build.gradle
里使用,两个gradle
文件在同一级目录下的情况下,不需要导包,且可直接使用rootProject
android {
compileSdkVersion rootProject.ext.complileSdkVersion
defaultConfig {
applicationId "com.xxx.xxx"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName // 此时引用的versionName就是经过版本环境转换过的
}
}