我们在开发App时,通常在项目的Release阶段我们需要设置应用的版本号和版本名称,也就是设置下面两个属性
versionCode
versionName
版本号
其中versionCode的值是int类型,主要作用就是作为应用内部的版本编号,为版本升级提供唯一的标识,通常设为是自增的,假如当前app的versionCode为1,下一代app的versionCode为2,那么就可以通过它来判断应用是否需要升级、是否有新版本,也就是versionCode的值越大那么app就越新。它通常是对用户不可见的,因为它只是一个int类型值,显示出来无任何意义
versionName的值是String类型,它就是版本的名称,通常叫做版本号,是提供给用户看的,以便供用户知道当前自己安装的是哪个版本的app,一般在app的设置界面和应用市场上我们看到的版本号就是这个
手动管理产生的问题
假设当前版本是这样的:
defaultConfig {
applicationId "com.sunzxy.sunzxyongdemo"
minSdkVersion 16
targetSdkVersion 23
versionCode 11246
versionName "6.0.1"
}
它的versionCode为11246,现在已经非常大了,通常我们手动去记住这个versionCode和对应的versionName比较容易出错,而且随后期迭代的非常多的时候,这时候非常混乱,而versionCode(Name)出错则会导致不可预料的后果:
1、新Release的应用versionCode比旧版的versionCode小,导致app升不了级,新Release的应用使用了同一个的versionName,导致用户不升级
2、手动管理的话,假如其中一个工程师一不小心把下一代app的versionCode误写成了12246,而再下一版的是另外一个工程师发布的,如果versionCode还是按最开始的自增,那么versionCode为11248,当应用发布出去,包括所有versionCode小于12247的应用用户将都升不了级,唯一的办法就是把今后迭代的app的versionCode从12246以后开始自增
通过gradle自动管理应用程序版本
上面我们说了采用人工的方式去管理应用的版本是比较容易出错的,所以既然手动管理不行,那么就采取自动管理的方式去管理吧,而versionCode的作用就是提供一个int类型的版本标识供应用升级,而每一次release的时候这个versionCode都应该确保比旧版本的值大,所以可以通过在release时候让versionCode自动+1来确保这个版本是最新的版本,而这个工作则是由gradle来完成的。
我们在Module目录下新建一个version.properties文件作为存储versionCode文件,里面我们给它一个初始值为
VERSION_CODE=1
然后在Module目录下的gradle配置这样一段代码:
def versionPropsFile = file("version.properties")
if (versionPropsFile.canRead()) {
Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def runTasks = gradle.startParameter.taskNames
def int verCode = versionProps['VERSION_CODE'].toInteger()
if (':app:assembleRelease' in runTasks) {
versionProps['VERSION_CODE'] = (verCode + 1).toString()
versionProps.store(versionPropsFile.newWriter(), null)
}
defaultConfig {
applicationId "com.sunzxy.sunzxyongdemo2"
minSdkVersion 16
targetSdkVersion 23
versionCode verCode
versionName "1.2"
}
} else {
throw new GradleException("Could not read version.properties!")
}
那么当我们release这个项目时候,每release一次这个versionCode将会自动加1,如下我release了一次,它自动加了1
通过gradle自动管理versionCode,我们无需手动修改这个versionCode了,只需要在release时候把版本号versionName更新即可