Android 用groovy在gradle自定义字段方法实现一键切换versionName版本

一、问题:在平时开发中经常会对某些项目状态进行变更,通过debug状态来区分环境,代码里通过BuildConfig,但gradle里却没有类似的方法,下面演示了如何在gradle文件里自定义一个字段实现状态切换(主要是groovy不够熟悉)
  1. 例如Android文件里判断环境:
if (BuildConfig.DEBUG) {
	// TODO: xxx
}else{
	// TODO: xxx
}

以上情况在代码里使用确实很方便,但如果转移到build.gradle里,比如输出版本类型,就只有在buildTypes里通过自定义buildConfigField来配置不同版本类型的versionName

  1. 在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就是经过版本环境转换过的
    }
}
三、结语:groovy是门非常强大的语言,能用自动化来减轻开发中很多琐碎的事,在研究过程中遇到一个问题:方法调用不能在其他属性字段定义之上,否则会方法里用到的字段会报错找不到

你可能感兴趣的:(Android技术,android,gradle,groovy)