两种方法实现VersionCode和VersionName自增

来源:互联网 发布:减肥晚上吃什么 知乎 编辑:程序博客网 时间:2024/05/21 13:54

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

//按日期生成的包名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)                    }                }            }         }    }}
0 0