Android打包VersionCode自增

在开发Android项目完之后,我们都会打包然后发布到各个渠道。如果有版本修改,需要再次打包发布,这个时候我们就需要把versionCode和versionName手动去修改,这样才能保证app能够在用户手中升级。

但是,咱们是不是会有时候忘记去修改这两个值的情况呢?(反正我是经常忘记的)如果忘记修改了,那么,这次打包就白打了。

针对这个问题,我们有没有什么办法呢?答案是:肯定有的,下面我来分享一下我的经验


第一步:

创建一个文件,名字就叫version.properties(当然,这个不一定要这么写),位置和build.gradle文件同级,app这个是我的执行module,

文件里面的内容是:

VERSION_CODE=10104




第二步:

在build.gradle文件里面加入以下代码(注意:代码的位置和android{...}平级),此方法是获取自增之后的版本号

def getVersionCode() {// 获取版本号
    def versionFile = file('version.properties')// 读取第一步新建的文件
    if (versionFile.canRead()) {// 判断文件读取异常
        Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(versionFile))
        def versionCode = versionProps['VERSION_CODE'].toInteger()// 读取文件里面的版本号
        def runTasks = gradle.startParameter.taskNames 
        if ('assembleRelease' in runTasks ) {//仅在assembleRelease任务是增加版本号,其他渠道包在此分别配置
			// 版本号自增之后再写入文件(此处是关键,版本号自增+1)
        	versionProps['VERSION_CODE'] = (++versionCode).toString()
        	versionProps.store(versionFile.newWriter(), null)
        }
        return versionCode // 返回自增之后的版本号
    } else {
        throw new GradleException("Could not find version.properties!")
    }
}

android{
	...
}

需要特别注意的是,正常情况,我们只有在打包的时候才需要自增versionCode,平时调试是不需要改变这个值的,所以我们需要加入下面这个判断


如果有多渠道打包时,可以这样写,task1和task2要根据具体情况而定。

 if ('assembleRelease' in runTasks || 'task1' in runTasks || 'task2' in runTasks ) {//仅在assembleRelease任务是增加版本号,其他渠道包在此分别配置
			// 版本号自增之后再写入文件(此处是关键,版本号自增+1)
        	versionProps['VERSION_CODE'] = (++versionCode).toString()
        	versionProps.store(versionFile.newWriter(), null)
        }

值得一提的是,我在做这一步的时候,碰到了一个坑,我没有设置多渠道打包,按理说task的值是assembleRelease(一般情况是这样的),但是实际上我这里需要用:app:assembleRelease,至于什么原因,此处就不说了,教大家一个很简单的方法来确定这个值:

就是你打包一个release的apk,打包的过程中你可以看到这段代码,其中2中红色框框里面的中括号内容便是你所需要的



第三步:

build.gradle文件,在你设置版本号的加入一下代码


我这里是直接在默认位置设置的版本号,要注意这段代码的位置哟!!!

versionName和versionCode处理方式类似,最后再去简单说明一下

def currentVersionCode = getVersionCode()

现在,你再去打包,你会发现,version.properties里面的10104变成了10105,如果没有改变,有两个可能:

1、第二步里面的 assembleRelease 错了,请按照第二步中红色文字调试

2、第三步中,getVersionCode()方法的位置错了(我当时不小心放到defaultConfig{...}中去了)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最后,简单提一下getVersionName()这个方法

def getVersionName() {
    def date = new Date();
    def versionName = date.format('yyyyMMddHHmmss');
    return versionName
}
此处我是用时间戳来处理的,当然,你也可以用你觉得合适的方式来做自动化处理


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值