1. 程式人生 > >Android配置build.gradle實現Version Code編譯release包時自動增長(一)

Android配置build.gradle實現Version Code編譯release包時自動增長(一)

Android配置build.gradle實現Version Code編譯release包時自動增長(一)

經常的,開發者在上線釋出之前要打出很多測試包給測試團隊測試,每次打出的release包為了區分不同的版本號,需要手動的修改Android裡面的配置檔案build.gradle的versionCode欄位,這一工作純屬於機械的手工修改,重複勞動,一不小心可能還會把版本號version code改錯,因此,需要尋找一種方案,在打包時候,自動實現version code自動增長,無需人工手動維護,現在就給出一個方案,通過配置Android Studio中的build.gradle檔案實現這一目的。給出完整的模組app下build.gradle檔案:

apply plugin: 'com.android.application'

android {

    def currentVersionCode = getVersionCode()

    defaultConfig {
        ......

        versionCode currentVersionCode

        ......
    }

    ......
}

......


def getVersionCode() {
    def versionCodeFile = file('version_code.properties')
    if (versionCodeFile.canRead()) {
        Properties properties = new Properties()
        properties.load(new FileInputStream(versionCodeFile))
        def versionCode = properties['VERSION_CODE'].toInteger()//讀取version_code.properties檔案存放的版本號。
        def runTasks = gradle.startParameter.taskNames
        def task = ':app:assembleRelease'
        if (task in runTasks) {
            properties['VERSION_CODE'] = (++versionCode).toString()
            properties.store(versionCodeFile.newWriter(), null)
        }

        return versionCode
    } else {
        throw new GradleException("無法讀取version_code.properties檔案!")
    }
}


要特別注意currentVersionCode位置,不要放在defaultConfig裡面。

配置檔案version_code.properties裡面寫一個初始值,後續的編譯版本將在這個基礎上實現自增長,即沒釋出一個release版本,version_code.properties裡面的VERSION_CODE將自動加1。version_code.properties和當前的app模組同處於一個檔案目錄下:

version_code.properties內容:

VERSION_CODE=1

關鍵是gradle裡面getVersionCode()函式的編寫。getVersionCode()只會在正式編譯生成release包時候才去主動增加version code的值,其他情況如debug包不受影響不做變化。這裡面的變數task定義容易出錯
def task = ':app:assembleRelease'
其中task的值在不同的專案中會有不同,在我的例子中,task的值可以通過Android Studio帶的Event log日誌檢視到底是什麼:

在我的例子中,task的值是方括號裡面的:app:assembleRelease。

總結起來,有兩處要點如果沒配置對,將不能正確自增長version code值:

(1)在當前build.gradle裡面定義currentVersionCode的位置不對。

(2)def task的值,沒有和當前Android Studio編譯release的task名稱一致。
嚴格按照本文的定義結構和build過程中Event Log輸出的task名稱編寫實現則會正確實現目標。