Android打包VersionCode自增

在開發Android項目完之後,我們都會打包然後發佈到各個渠道。如果有版本修改,需要再次打包發佈,這個時候我們就需要把versionCode和versionName手動去修改,這樣才能保證app能夠在用戶手中升級。

但是,咱們是不是會有時候忘記去修改這兩個值的情況呢?(反正我是經常忘記的)如果忘記修改了,那麼,這次打包就白打了。

針對這個問題,我們有沒有什麼辦法呢?答案是:肯定有的,下面我來分享一下我的經驗


第一步:

創建一個文件,名字就叫version.properties(當然,這個不一定要這麼寫),位置和build.gradle文件同級,app這個是我的執行module,

文件裏面的內容是:

VERSION_CODE=10104




第二步:

在build.gradle文件裏面加入以下代碼(注意:代碼的位置和android{...}平級),此方法是獲取自增之後的版本號

def getVersionCode() {// 獲取版本號
    def versionFile = file('version.properties')// 讀取第一步新建的文件
    if (versionFile.canRead()) {// 判斷文件讀取異常
        Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(versionFile))
        def versionCode = versionProps['VERSION_CODE'].toInteger()// 讀取文件裏面的版本號
        def runTasks = gradle.startParameter.taskNames 
        if ('assembleRelease' in runTasks ) {//僅在assembleRelease任務是增加版本號,其他渠道包在此分別配置
			// 版本號自增之後再寫入文件(此處是關鍵,版本號自增+1)
        	versionProps['VERSION_CODE'] = (++versionCode).toString()
        	versionProps.store(versionFile.newWriter(), null)
        }
        return versionCode // 返回自增之後的版本號
    } else {
        throw new GradleException("Could not find version.properties!")
    }
}

android{
	...
}

需要特別注意的是,正常情況,我們只有在打包的時候才需要自增versionCode,平時調試是不需要改變這個值的,所以我們需要加入下面這個判斷


如果有多渠道打包時,可以這樣寫,task1和task2要根據具體情況而定。

 if ('assembleRelease' in runTasks || 'task1' in runTasks || 'task2' in runTasks ) {//僅在assembleRelease任務是增加版本號,其他渠道包在此分別配置
			// 版本號自增之後再寫入文件(此處是關鍵,版本號自增+1)
        	versionProps['VERSION_CODE'] = (++versionCode).toString()
        	versionProps.store(versionFile.newWriter(), null)
        }

值得一提的是,我在做這一步的時候,碰到了一個坑,我沒有設置多渠道打包,按理說task的值是assembleRelease(一般情況是這樣的),但是實際上我這裏需要用:app:assembleRelease,至於什麼原因,此處就不說了,教大家一個很簡單的方法來確定這個值:

就是你打包一個release的apk,打包的過程中你可以看到這段代碼,其中2中紅色框框裏面的中括號內容便是你所需要的



第三步:

build.gradle文件,在你設置版本號的加入一下代碼


我這裏是直接在默認位置設置的版本號,要注意這段代碼的位置喲!!!

versionName和versionCode處理方式類似,最後再去簡單說明一下

def currentVersionCode = getVersionCode()

現在,你再去打包,你會發現,version.properties裏面的10104變成了10105,如果沒有改變,有兩個可能:

1、第二步裏面的 assembleRelease 錯了,請按照第二步中紅色文字調試

2、第三步中,getVersionCode()方法的位置錯了(我當時不小心放到defaultConfig{...}中去了)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最後,簡單提一下getVersionName()這個方法

def getVersionName() {
    def date = new Date();
    def versionName = date.format('yyyyMMddHHmmss');
    return versionName
}
此處我是用時間戳來處理的,當然,你也可以用你覺得合適的方式來做自動化處理


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章