Android Gradle配置版本號自增并生成對應(yīng)apk總結(jié)

前言

相信大家開發(fā)Android過程中會(huì)遇到這樣的場景

  • 每次打包給測試或者/發(fā)布時(shí) 需要增加版本號(versionCode)及版本名(versionName)
  • 生成的apk需要根據(jù)一定規(guī)則重命名

自增版本號有利于測試/用戶反饋BUG時(shí)方便定位是那個(gè)版本出現(xiàn)的;重命名apk文件有利于通過文件名知道該apk是什么項(xiàng)目的什么版本

可能遇到問題

1、每次打包發(fā)布時(shí)需要手動(dòng)變更gradle 配置的versionCode及versionName种远;
對于開發(fā)者來說每次手動(dòng)操作是比較麻煩的也是不符合可持續(xù)發(fā)展;另外比較重要的問題是:容易忘記 這樣就不利于測試/用戶反饋問題開發(fā)者定位問題了疏橄。因?yàn)殚_發(fā)者以為的xxx版本不一定是測試/用戶反饋的xxx版本,因?yàn)槟?幾)次你忘記了變更版本號了魄梯。
2、生成的apk文件默認(rèn)一般都是release/debug 沒有明確的表明是某個(gè)項(xiàng)目的某個(gè)版本的apk科汗。

如何解決

首先:創(chuàng)建版本管理文件

在項(xiàng)目的根目錄下創(chuàng)建一個(gè)名為version.properties的文本文件用于管理versionCode用于自增。(路徑及文件名非固定以gradle可以正常加載和解析為原則)

創(chuàng)建version.properties文件

在version.properties文件下編輯版本號字段

VERSION_CODE=xxx

其中xxx 為版本號versionCode 為int值

versionCode 示例

其次:gradle解析并實(shí)現(xiàn)對于自增邏輯

1绷雏、在gradle根部定義全局的code及name用于自增邏輯賦值并最終賦值給defaultConfig標(biāo)簽下的versionCode及versionName

//定義版本號及版本名
def verCode = 28
def verName = "1.0.28"

2头滔、解析version.properties文件并實(shí)現(xiàn)自增邏輯

    //版本號及版本名自增邏輯開始
    //如果version.properties文件可讀則執(zhí)行操作
    def versionPropsFile = file('../version.properties')
    if (versionPropsFile.canRead()) {
        //載入version.properties
        Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(versionPropsFile))
        //從version.properties根據(jù)關(guān)鍵字"VERSION_CODE"取Integer
        verCode = versionProps['VERSION_CODE'].toInteger()
        //判斷build模式,如果是特定模式
        // 則自增版本號,并且寫回version.properties文件中
        def runTasks = gradle.startParameter.taskNames
        //根據(jù)實(shí)際情況進(jìn)行處理
        if ('assembleRelease' in runTasks || 'assembleDebugTest' in runTasks) {
            //版本號自增并寫入版本控制文件
            versionProps['VERSION_CODE'] = (++verCode).toString()
            verName = "1.0." + versionProps['VERSION_CODE'].toString()
            versionProps.store(versionPropsFile.newWriter(), null)
        }
    } else {
        throw new GradleException("Could not find version.properties!")
    }
    //版本號及版本名自增邏輯結(jié)束
注意:最近升級as 3.1.2 +gradle 4.4 發(fā)現(xiàn)File語法問題特此更正 將原 new File('version.properties') 更改為 file('../version.properties')

3、配置defaultConfig標(biāo)簽下的versionCode及versionName

    defaultConfig {
         //其它配置
        versionCode verCode
        versionName verName
        //其它配置
   }

4涎显、配置重命名最終生成apk 規(guī)則

4.1 筆者習(xí)慣的apk命名模式為如下配置-gradle3.0以下:
//獲取當(dāng)前時(shí)間
def getCurrentTime() {
    return new Date().format("yyyy-MM-dd_HH-mm", TimeZone.getTimeZone("GMT+8"))
}
buildTypes {
        debug {
           //各種配置
        }
        debugTest {
          //各種配置
        }
        release {
            //各種配置
        }
        //重命名生成apk
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('.apk')) {
                    //重命名apk文件名: 項(xiàng)目名_v版本名_構(gòu)建類型_打包時(shí)間.apk
                    def fileName = "XXX_v${defaultConfig.versionName}_${variant.buildType.name}_${getCurrentTime()}.apk"
                    //執(zhí)行重命名操作
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    }
4.2 筆者習(xí)慣的apk命名模式為如下配置-gradle3.0以上:
applicationVariants.all { variant ->
        variant.outputs.all {
            if (variant.name.endsWith("release")) {
                 //重命名apk文件名: 項(xiàng)目名_v版本名_構(gòu)建類型_打包時(shí)間.apk
                outputFileName = "XXX_v${defaultConfig.versionName}_${variant.buildType.name}_${getCurrentTime()}.apk"
            }
        }
    }

5坤检、構(gòu)建打包

構(gòu)建打包
最終生成apk

結(jié)語

該解決方案為網(wǎng)絡(luò)實(shí)現(xiàn)手段并結(jié)合自己習(xí)慣整理而成.權(quán)當(dāng)拋磚引玉了,萬望各位不吝賜教。

關(guān)于我

簡書: AriesHoo
GitHub: AriesHoo
Email: AriesHoo@126.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末期吓,一起剝皮案震驚了整個(gè)濱河市早歇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讨勤,老刑警劉巖箭跳,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潭千,居然都是意外死亡谱姓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門刨晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逝段,“玉大人,你說我怎么就攤上這事割捅。” “怎么了帚桩?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵亿驾,是天一觀的道長。 經(jīng)常有香客問我账嚎,道長莫瞬,這世上最難降的妖魔是什么儡蔓? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮疼邀,結(jié)果婚禮上喂江,老公的妹妹穿的比我還像新娘。我一直安慰自己旁振,他們只是感情好获询,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拐袜,像睡著了一般吉嚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹬铺,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天尝哆,我揣著相機(jī)與錄音,去河邊找鬼甜攀。 笑死秋泄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的规阀。 我是一名探鬼主播恒序,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姥敛!你這毒婦竟也來了奸焙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彤敛,失蹤者是張志新(化名)和其女友劉穎与帆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨榄,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玄糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袄秩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阵翎。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖之剧,靈堂內(nèi)的尸體忽然破棺而出郭卫,到底是詐尸還是另有隱情,我是刑警寧澤背稼,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布贰军,位于F島的核電站,受9級特大地震影響蟹肘,放射性物質(zhì)發(fā)生泄漏词疼。R本人自食惡果不足惜俯树,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贰盗。 院中可真熱鬧许饿,春花似錦、人聲如沸舵盈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽书释。三九已至翘贮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爆惧,已是汗流浹背狸页。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扯再,地道東北人芍耘。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像熄阻,于是被迫代替她去往敵國和親斋竞。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

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