在開發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
}
此處我是用時間戳來處理的,當然,你也可以用你覺得合適的方式來做自動化處理