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

前言

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

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

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

可能遇到問題

1、每次打包發(fā)布時(shí)需要手動(dòng)變更gradle 配置的versionCode及versionName;
對(duì)于開發(fā)者來說每次手動(dòng)操作是比較麻煩的也是不符合可持續(xù)發(fā)展;另外比較重要的問題是:容易忘記 這樣就不利于測(cè)試/用戶反饋問題開發(fā)者定位問題了。因?yàn)殚_發(fā)者以為的xxx版本不一定是測(cè)試/用戶反饋的xxx版本,因?yàn)槟?幾)次你忘記了變更版本號(hào)了。
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文件下編輯版本號(hào)字段

VERSION_CODE=xxx

其中xxx 為版本號(hào)versionCode 為int值

versionCode 示例

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

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

//定義版本號(hào)及版本名
def verCode = 28
def verName = "1.0.28"

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

    //版本號(hào)及版本名自增邏輯開始
    //如果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模式,如果是特定模式
        // 則自增版本號(hào),并且寫回version.properties文件中
        def runTasks = gradle.startParameter.taskNames
        //根據(jù)實(shí)際情況進(jìn)行處理
        if ('assembleRelease' in runTasks || 'assembleDebugTest' in runTasks) {
            //版本號(hào)自增并寫入版本控制文件
            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!")
    }
    //版本號(hào)及版本名自增邏輯結(jié)束
注意:最近升級(jí)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)于我

簡(jiǎn)書: AriesHoo
GitHub: AriesHoo
Email: AriesHoo@126.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容