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