1. 程式人生 > >Gradle使用詳解(五) 之 動態生成APP版本號

Gradle使用詳解(五) 之 動態生成APP版本號

我們清楚知道,幾乎所有的軟體都是存在一個版本號的東西,APP作為手機上的應用軟體也不例外。版本號可以幫助APP升級使用和定位問題。一般地,版本號有3部分構成:主版本號、副版本號 以及 補丁號,例如:1.0.123。也可以是單一個主版本號,格式沒有嚴格要求。

方法一、直接配置在build.gradle檔案

我們在前面的博文《Gradle使用詳解(三) 之 Android Gradle外掛配置詳解》中有提到,在Android Gradle中配置版本相關資訊主要是給defaultConfig配置塊中指定versionCode和verionName兩個欄位,例如:

android {
    ……
    defaultConfig {
        ……
        versionCode 1
        versionName "1.0"
    }
}

這種方式最直觀,也最粗暴。它存在一個很大的問題,就是當我們的buidl.gradle檔案程式碼越來越多時就會不容易查詢,而且修改一旦只為修改一個版本號而導致出錯或版本衝突的代價很高。所以一般我們是不建議這樣做的。

方法二、指令碼外掛配置

還記得我們在前面博文《Gradle使用詳解(二) 之 專案結構和初識Java Gradle外掛》中介紹指令碼外掛嗎?應用指令碼外掛,其實就是把這個指令碼載入進來,它使用的是關鍵字from,後面緊跟的是一個指令碼檔案,例如在build.gradle同級目錄中新建一個version.gradle檔案,內容如下:

ext {
   appVersionName = '1.0.0'
   appVersionCode = 100
}

然後修改build.gradle內容,在開始時使用apply from載入version.gradle指令碼檔案,然後為 versionCodeversionName欄位指向appVersionNameappVersionCode兩個變數:

apply from:'version.gradle'

android {
    ……
    defaultConfig {
        ……
        versionCode appVersionCode
        versionName appVersionName
    }
}
這樣我們把APP的版本號和版本名稱單獨放在一個指令碼檔案裡。以後每次APP發版本只需要更改version.gradle檔案即可。這種方式的使用比較廣泛。

方法三、從git的tag中自動獲取版本號

如果你的專案開發是使用gif進行版本控制的話,在每次釋出版本時一般情況下都會進行版本分支的建立和打上相應的Tag。這樣做的好處就是在新版本的釋出的時候能清楚記錄版本截止到的功能點,同時也不會因為釋出當前版本而停下來,導致影響團隊其他人在主幹上的繼續開發。後續若存在修改BUG等操作再另外同步回主幹,這樣做是非常便於團隊合作。

我們在建立Tag時若是使用版本名稱來命名,就可以通過git命令很簡單經獲得該Tag來作為版本名稱。命令如下:

git describe --abbrev=0 –tags

至於版本號,我們可以通過命令來獲取歷史所有的Tag數量,這樣也剛好每次建立Tag後,版本號就加1,符合版本號的遞增邏輯。要獲取Tag數量數量可以使用命令:

git tag –list

清楚思路後後,接下來就是修改build.gradle內容,即定義兩個獲得版本名稱和版本號的方法,然後對versionCodeversionName欄位進行指定:

def getAppVersionName() {
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--abbrev=0', '--tags'
        standardOutput = stdout
    }
    return stdout.toString()
}
def getAppVersionCode(){
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git','tag','--list'
        standardOutput = stdout
    }
    return stdout.toString().split("\n").size()
}
def appVersionName = getAppVersionName()
def appVersionCode = getAppVersionCode();
android {
    ……
    defaultConfig {
        ……
        versionCode appVersionCode
        versionName appVersionName
    } 
}

通過這種方式,我們只需要在釋出版本打包前,給程式碼分支建立一個以版本名稱作為命名的Tag,然後Android Gradle在打包時就會自動生成應用的版本名稱和版本號,不需要修改一行程式碼非常方便,也不用擔心因為寫錯版本資訊而擔心。