两种方法实现VersionCode和VersionName自增

方法一:根据当前时间实现版本号自增

//按日期生成的包名
def versionTag() {
    return new Date().format("MMdd", TimeZone.getTimeZone("UTC"))
}

// versionCode按时间自增
def increasedVersionCode(){
   return (int)(System.currentTimeMillis()/1000/60/60/24-17141)
}

android {
    ...
    defaultConfig {
        ...
        versionCode increasedVersionCode()
        ...
    }
    ...
    buildTypes {
        release {...}
        debug {...}
        // 按日期命名release包
        applicationVariants.all { variant ->
            def file = variant.outputs[0].outputFile
            if(!file.name.contains("debug")){
                variant.outputs[0].outputFile = new File(file.parent, file.name.replace("app-rmapk-", "apk名_" + versionTag()+"_"))
            }
        }
    }
}

方法1优点是代码简单,缺点是还是不够灵活,比如我定的12个小时更新一个版本号,万一需要12小时内更新两个版本呢?如果改成6小时,某些强迫症患者比如我又会觉得很多版本号没用上,不舒服。如果你也这样觉得,请看方法2.

方法二:根据打release版本的次数实现版本号自增

  1. 在“gradle.properties”里定义key-value:VERSION_CODE = 1;你也可以在app目录下新建一个properties文件,我这里为了省懒。

  2. 原理就是:每次打release版本时从properties文件中读取上一个版本号,然后+1生成新版本号,并覆盖properties文件中的旧版本号。如果碰到“找不到文件”或者不能read的情况,请检查路径,比如这里的gradle.properties是在app的gradle文件的上一级目录,也就是project目录下。这里判断propFile.canRead也省下了,gradle自己就会抛异常,没必要自己再抛一次。

ext { // 定义当前gradle文件的全局变量
    isRelease = checkRelease()
    targetTask = ""
}

// 通过taskName判断当前操作是否是在打release包,只需执行一次
def checkRelease() {
    def runTasks = gradle.startParameter.taskNames
    for (String task : runTasks) {
        // 我这里认为执行“assemble”和非“debug”的任务就是执行“release”的任务
        if (task.contains("assemble") && !task.contains("Debug")) {
            targetTask = task
            return true
        }
    }
    return false
}

def increasedVersionCode() {
    def propFile = file('../gradle.properties')
    def Properties props = new Properties()
    props.load(new FileInputStream(propFile))
    // 读取gradle.properties文件中定义的VERSION_CODE属性
    def code = props['VERSION_CODE'].toInteger()
    if (isRelease) {
        code++
        props['VERSION_CODE'] = code.toString()
        // 将最新的versionCode写入gradle.properties文件中
        props.store(propFile.newWriter(), null)
    }
    return code
}

android {
    ...

    defaultConfig {
        ...
        versionCode increasedVersionCode()
        ...
    }
    ...
    // 修改release包的apk文件名
    applicationVariants.all { variant ->
        // 这里是个循环,所以不要在这checkRelease()
        def buildTypeName = variant.buildType.name
        println("buildType-------->" + buildTypeName)
        // 不要修改debug包的名,不然每次调试运行都会创建新包
        if ("release" == buildTypeName) {
            def file = variant.outputs[0].outputFile;
            def fileName = "appName_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${variant.flavorName}_${buildTypeName}.apk"
            tasks.all{ // 遍历任务集合
                if(targetTask == it.name){
                    it.doLast{ //执行完目标任务之后
                        variant.outputs[0].outputFile = new File(file.parent, fileName)
                    }
                }
            } 
        }
    }
}

你可能感兴趣的:(gradle)