方法一:根据当前时间实现版本号自增
//按日期生成的包名
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版本的次数实现版本号自增
在“gradle.properties”里定义key-value:
VERSION_CODE = 1
;你也可以在app目录下新建一个properties文件,我这里为了省懒。原理就是:每次打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)
}
}
}
}
}
}