Android配置build.gradle编译release包以日期加序列号自增长为Version Code以及Version Name区分不同类型(三)

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/84776905

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

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/84776905