- 本文為 AriesHoo 原創(chuàng),轉(zhuǎn)載必須保留出處忘苛!
- 【 GitHub-AriesHoo】
- 【 簡書-AriesHoo】
前言
相信大家開發(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