两种方法实现VersionCode和VersionName自增

两种方法实现VersionCode和VersionName自增

标签: 版本号自增版本名打包自动命名
  741人阅读  评论(0)  收藏  举报
  分类:

目录(?)[+]

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

//按日期生成的包名
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

方法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)
                    }
                }
            } 
        }
    }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值