【Android技巧之相見恨晚系列】-自制Gradle腳本動(dòng)態(tài)設(shè)置版本號(hào)


public static final 傳送門 傳送門① =更優(yōu)雅的 Android 發(fā)布自動(dòng)版本號(hào)方案 ;

public static final 傳送門 傳送門② =Android應(yīng)用編譯時(shí)自動(dòng)生成版本號(hào) ;

public static final 傳送門 傳送門③ =Android Studio 多渠道打包脊另、自動(dòng)版本號(hào)及 gradlew 命令的基本使用 ;


以前在做重度/中度SQLite相關(guān)的應(yīng)用的時(shí)候虐急,經(jīng)常遇到一個(gè)問(wèn)題,就是需要不停的增加數(shù)據(jù)庫(kù)的版本號(hào)统扳,來(lái)觸發(fā)onUpgrade方法,從而能更新表結(jié)構(gòu)。一般也都是采取versionCode來(lái)代替dbVersion船惨,然而開發(fā)過(guò)程中债沮,還是得手動(dòng)修改版本號(hào)才行。鹿鳖。扁眯。當(dāng)時(shí)(還在Eclipse時(shí)代)就在苦苦追尋自動(dòng)設(shè)置版本號(hào)的方法ToT。翅帜。姻檀。

如今,有了前面聲明過(guò)的三篇好文章的指點(diǎn)涝滴,終于如愿以償绣版!又是相見恨晚......
此篇文章是根據(jù)前面兩篇好文之后自己再做的筆記。
首先歼疮,先貼出成品的build.gradle(module的):

apply plugin: 'com.android.application'

ext.majorNumber = 1
ext.minorNumber = 0
ext.revisionNumberCMD = 'git rev-list HEAD --count'
ext.revisionNumber = revisionNumberCMD.execute().getText().trim().toInteger()
ext.revisionDescriptionCMD = 'git describe --always'
ext.tempRevisionDescription = revisionDescriptionCMD.execute().getText().trim()
ext.revisionDescription = (tempRevisionDescription == null || (tempRevisionDescription).size() == 0) ? new Date().format("yyMMdd") : (tempRevisionDescription).substring((tempRevisionDescription).size() - 6)
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            applicationIdSuffix ".debug"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    defaultConfig {
        applicationId "..."
        minSdkVersion 15
        targetSdkVersion 23
        versionCode getVersionCode(false)
        versionName getVersionName(false)
    }

    applicationVariants.all { variant ->
        if (variant.buildType.name.equals('release')) {
            variant.mergedFlavor.versionCode = getVersionCode(true)
            variant.mergedFlavor.versionName = getVersionName(true)
        } else if (variant.buildType.name.equals('debug')) {
            variant.mergedFlavor.versionCode = getVersionCode(false)
            variant.mergedFlavor.versionName = getVersionName(false)
        }
    }
}

dependencies {
    ...
}

def getVersionCode(boolean isRelease) {
    // 正式環(huán)境
    if (isRelease) {
        majorNumber * 1000000 + minorNumber * 10000 + revisionNumber
    }
    // debug環(huán)境
    else {
        Integer.parseInt(new Date().format("yyMMddHHmm"))
    }
}

//Major_Version_Number.Minor_Version_Number[Revision_Number[.Build_Number]]
def getVersionName(boolean isRelease) {
    // 正式環(huán)境
    if (isRelease) {
        majorNumber + "." + minorNumber + "." + revisionNumber + "." + revisionDescription
    }
    // debug環(huán)境
    else {
        String today = new Date().format("yyMMdd")
        String time = new Date().format("HHmmss")
        majorNumber + "." + minorNumber + "." + revisionNumber + ".$today.$time." + revisionDescription
    }
}

Outputs:

debug release
對(duì)應(yīng)敲出git的命令
可以看到該git repo的總提交次數(shù)正是32杂抽,與版本號(hào)里面的RevisionNumber一致;describe的后6位韩脏,也正好與BuildNumber一致缩麸。

以上便是實(shí)現(xiàn)的效果:
debug的時(shí)候:每次run,都會(huì)根據(jù)時(shí)間戳來(lái)生成version info赡矢;
release的時(shí)候:根據(jù)項(xiàng)目需求杭朱,自行定制的算法來(lái)動(dòng)態(tài)生成version info愚屁;
(以上兩種算法都是可以自由定制的)

接下來(lái),我們反向來(lái)“一層一層一層地剝開我的心”痕檬。霎槐。。

首先看到的是這一代碼塊

    defaultConfig {
        applicationId "..."
        minSdkVersion 15
        targetSdkVersion 23
        versionCode getVersionCode(false)
        versionName getVersionName(false)
    }

這里我們自定義了兩個(gè)方法梦谜,來(lái)動(dòng)態(tài)生成version info丘跌,去瞧瞧方法里面干了些啥

def getVersionCode(boolean isRelease) {
    // 正式環(huán)境
    if (isRelease) {
        majorNumber * 1000000 + minorNumber * 10000 + revisionNumber
    }
    // debug環(huán)境
    else {
        Integer.parseInt(new Date().format("yyMMddHHmm"))
    }
}

def getVersionName(boolean isRelease) {
    // 正式環(huán)境
    if (isRelease) {
        majorNumber + "." + minorNumber + "." + revisionNumber + "." + revisionDescription
    }
    // debug環(huán)境
    else {
        String today = new Date().format("yyMMdd")
        String time = new Date().format("HHmmss")
        majorNumber + "." + minorNumber + "." + revisionNumber + ".$today.$time." + revisionDescription
    }
} 

Release時(shí),采取的正是傳送門②的算法:

versionCode = 主版本號(hào)*1000000 +次版本號(hào)*10000+修訂號(hào)
versionName = 主版本號(hào).次版本號(hào).修訂版本號(hào).編譯版本號(hào)

Debug時(shí)唁桩,則是自己暫時(shí)采取的簡(jiǎn)易自增法——時(shí)間戳:

versionCode = yyMMddHHmm
versionName = 主版本號(hào).次版本號(hào).修訂版本號(hào).yyMMdd.HHmmss.編譯版本號(hào)

然后就是如何定制這4種版本號(hào)了:

ext.majorNumber = 1
ext.minorNumber = 0
ext.revisionNumberCMD = 'git rev-list HEAD --count'
ext.revisionNumber = revisionNumberCMD.execute().getText().trim().toInteger()
ext.revisionDescriptionCMD = 'git describe --always'
ext.tempRevisionDescription = revisionDescriptionCMD.execute().getText().trim()
ext.revisionDescription = (tempRevisionDescription == null || (tempRevisionDescription).size() == 0) ? new Date().format("yyMMdd") : (tempRevisionDescription).substring((tempRevisionDescription).size() - 6)

主版本號(hào):手動(dòng)根據(jù)產(chǎn)品迭代自行定義大版本號(hào)

次版本號(hào):手動(dòng)根據(jù)產(chǎn)品迭代自行定義次版本號(hào)

修訂版本號(hào):自動(dòng)采用git命令獲取當(dāng)前repo的總Commit次數(shù)

編譯版本號(hào):自動(dòng)采用git命令獲取當(dāng)前repo的里程碑(截取后6位)

這里的git命令就是前面三篇文章里傳授的闭树。
最后,受傳送門①傳送門③ 的啟發(fā)荒澡,區(qū)分了一下Release和Debug的buildtype從而采用不同的算法生成version info

    applicationVariants.all { variant ->
        if (variant.buildType.name.equals('release')) {
            variant.mergedFlavor.versionCode = getVersionCode(true)
            variant.mergedFlavor.versionName = getVersionName(true)
        } else if (variant.buildType.name.equals('debug')) {
            variant.mergedFlavor.versionCode = getVersionCode(false)
            variant.mergedFlavor.versionName = getVersionName(false)
        }
    }

Sync Now 一下报辱,可以去build-generated-source-buildconfig目錄下查看BuildConfig.java文件

debug的BuildConfig.java
release的BuildConfig.java

這樣,10小目標(biāo)就實(shí)現(xiàn)了单山。碍现。。


參考文獻(xiàn)
1.版本號(hào)——百度百科
2.簡(jiǎn)書官方markdown指南
3.md官方指南不夠這篇來(lái)湊


最后米奸,拙筆畫一幅美圖祝福大家中秋賞月快樂(lè)昼接!

皓月當(dāng)空?qǐng)D(手機(jī)觀賞效果更佳)
?
????????????????????????〇
?
?
?
?
?
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悴晰,隨后出現(xiàn)的幾起案子慢睡,更是在濱河造成了極大的恐慌,老刑警劉巖铡溪,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漂辐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棕硫,警方通過(guò)查閱死者的電腦和手機(jī)髓涯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)饲帅,“玉大人复凳,你說(shuō)我怎么就攤上這事≡畋茫” “怎么了育八?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赦邻。 經(jīng)常有香客問(wèn)我髓棋,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任按声,我火速辦了婚禮膳犹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘签则。我一直安慰自己须床,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布渐裂。 她就那樣靜靜地躺著豺旬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柒凉。 梳的紋絲不亂的頭發(fā)上族阅,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音膝捞,去河邊找鬼坦刀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蔬咬,可吹牛的內(nèi)容都是我干的鲤遥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼计盒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渴频!你這毒婦竟也來(lái)了芽丹?” 一聲冷哼從身側(cè)響起北启,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拔第,沒想到半個(gè)月后咕村,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚊俺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年懈涛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泳猬。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡批钠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出得封,到底是詐尸還是另有隱情埋心,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布忙上,位于F島的核電站拷呆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茬斧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一腰懂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧项秉,春花似錦绣溜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贷屎,卻和暖如春罢防,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唉侄。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工咒吐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人属划。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓恬叹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親同眯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绽昼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)须蜗,斷路器硅确,智...
    卡卡羅2017閱讀 134,661評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,823評(píng)論 6 342
  • 高二放假前,魚頭從姐姐的精品店里拿了三條編制的手繩明肮,給大軍和我一人一條菱农。回到宿舍柿估,接受她們嘖嘖的檢視時(shí)循未,噢,特別滿...
    沈無(wú)醉閱讀 191評(píng)論 0 0
  • 這是我真正有意識(shí)的接觸的第一部西部片秫舌。 一位警長(zhǎng)威爾?凱恩為了保護(hù)鎮(zhèn)子而得罪了悍匪米勒的妖。在他出獄的那一天越好其...
    陳三瘦閱讀 480評(píng)論 0 0