1. 程式人生 > >Android配置build.gradle編譯release包以日期加序列號自增長為Version Code以及Version Name區分不同型別(三)

Android配置build.gradle編譯release包以日期加序列號自增長為Version Code以及Version Name區分不同型別(三)

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