Android配置build.gradle编译release包以日期加序列号自增长为Version Code以及Version Name区分不同类型(三)
前几篇文章介绍了如何通过配置build.gradle实现在编译release包时候,Version Code动态的以日期+序列号的形式自增长,从而无需人工干预手动修改配置文件。有些时候,开发者打出的包,可能还需要对Version Name实现自动的切换和调整,比如在Debug模式下的包Version Name为非正式的0.0.1,而在正式的release包情况下,Version Name则为正式的3.2.0诸如此类。下面在附录文章1、2的基础上,改进build.gradle实现这一目的,关键是build.gradle文件:
import java.text.DecimalFormat
apply plugin: 'com.android.application'
android {
......
def currentVersionName = getVersionName()
def currentVersionCode = getVersionCode()
defaultConfig {
.......
versionCode currentVersionCode
versionName currentVersionName
......
}
.......
}
dependencies {
.......
}
def getVersionName() {
def versionFile = file('version.properties')
if (versionFile.canRead()) {
Properties properties = new Properties()
properties.load(new FileInputStream(versionFile))
def versionName = properties['VERSION_NAME'].toString()
def taskNames = gradle.startParameter.taskNames
for (def name : taskNames) {
if (name.toString().toLowerCase().contains('release')) {
//正式的编译生成release包时候的正式版本名。
} else {
//测试情况下的Debug包的版本名。
versionName = '0.0.1'
}
}
return versionName
} else {
throw new GradleException("无法读取version.properties文件!")
}
}
def getVersionCode() {
def versionFile = file('version.properties')
if (versionFile.canRead()) {
Properties properties = new Properties()
properties.load(new FileInputStream(versionFile))
def versionCode = properties['VERSION_CODE'].toInteger()//读取version.properties文件存放的版本号。
def taskNames = gradle.startParameter.taskNames
for (def name : taskNames) {
if (name.toString().toLowerCase().contains('release')) {
properties['VERSION_CODE'] = (++versionCode).toString()
properties.store(versionFile.newWriter(), null)
}
}
return Integer.parseInt(getVersionCodePrefix() + addZeroForNumber(versionCode))
} else {
throw new GradleException("无法读取version.properties文件!")
}
}
//Version Code的前缀。年月日,例如20181203。
def getVersionCodePrefix() {
def date = new Date()
def versionCode = date.format('yyyyMMdd')
return versionCode
}
//给一个int整数左边补上0。比如一个整数值为1,经过addZeroForNumber处理后,返回01。
def addZeroForNumber(versionCode) {
DecimalFormat df = new DecimalFormat('00')
return df.format(versionCode);
}
同时,version.properties的配置文件:
#Mon Dec 03 17:23:07 CST 2018
VERSION_NAME=3.2.0
VERSION_CODE=1
version.properties文件的位置和app的build.gradle同一目录。如图:
配置好后,每次编译release包时候,Version Code即为当天日期拼接上VERSION_CODE的值,且每一次编译正式的release包,VSERSION_CODE都自增长1。
同时,VERSION_NAME在编译release包时候,即为正式的3.2.0(version.properties中定义的),如果是其他的Debug包,则为临时的0.0.1
特别注意:在getVersionName和getVersionCode中用于筛选的taskNames列表中的name,是根据执行的tasks具体的名字包含的关键词筛选的,debug包时候,tasks含有:app:assembleDebug:
Executing tasks: [:app:assembleDebug]
release包时候,含有:app:assembleRelease
Executing tasks: [:app:assembleRelease]
开发者根据自己项目的实际情况和需要进行筛查。
附录:
1,《Android配置build.gradle实现Version Code编译release包时自动增长(一)》链接https://blog.csdn.net/zhangphil/article/details/84770126
2,《Android配置build.gradle编译release包时以日期时间加序列号为Version Code且Version Code自动增长(二)》链接https://blog.csdn.net/zhangphil/article/details/84772805