- 本文为 AriesHoo 原创,转载必须保留出处!
- 【 GitHub-AriesHoo】
- 【 简书-AriesHoo】
前言
相信大家开发Android过程中会遇到这样的场景
- 每次打包给测试或者/发布时 需要增加版本号(versionCode)及版本名(versionName)
- 生成的apk需要根据一定规则重命名
自增版本号有利于测试/用户反馈BUG时方便定位是那个版本出现的;重命名apk文件有利于通过文件名知道该apk是什么项目的什么版本
可能遇到问题
1、每次打包发布时需要手动变更gradle 配置的versionCode及versionName;
对于开发者来说每次手动操作是比较麻烦的也是不符合可持续发展;另外比较重要的问题是:容易忘记 这样就不利于测试/用户反馈问题开发者定位问题了。因为开发者以为的xxx版本不一定是测试/用户反馈的xxx版本,因为某(几)次你忘记了变更版本号了。
2、生成的apk文件默认一般都是release/debug 没有明确的表明是某个项目的某个版本的apk。
如何解决
首先:创建版本管理文件
在项目的根目录下创建一个名为version.properties的文本文件用于管理versionCode用于自增。(路径及文件名非固定以gradle可以正常加载和解析为原则)

在version.properties文件下编辑版本号字段
VERSION_CODE=xxx
其中xxx 为版本号versionCode 为int值

其次:gradle解析并实现对于自增逻辑
1、在gradle根部定义全局的code及name用于自增逻辑赋值并最终赋值给defaultConfig标签下的versionCode及versionName
//定义版本号及版本名
def verCode = 28
def verName = "1.0.28"
2、解析version.properties文件并实现自增逻辑
//版本号及版本名自增逻辑开始
//如果version.properties文件可读则执行操作
def versionPropsFile = file('../version.properties')
if (versionPropsFile.canRead()) {
//载入version.properties
Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
//从version.properties根据关键字"VERSION_CODE"取Integer
verCode = versionProps['VERSION_CODE'].toInteger()
//判断build模式,如果是特定模式
// 则自增版本号,并且写回version.properties文件中
def runTasks = gradle.startParameter.taskNames
//根据实际情况进行处理
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!")
}
//版本号及版本名自增逻辑结束
注意:最近升级as 3.1.2 +gradle 4.4 发现File语法问题特此更正 将原 new File('version.properties') 更改为 file('../version.properties')
3、配置defaultConfig标签下的versionCode及versionName
defaultConfig {
//其它配置
versionCode verCode
versionName verName
//其它配置
}
4、配置重命名最终生成apk 规则
4.1 笔者习惯的apk命名模式为如下配置-gradle3.0以下:
//获取当前时间
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文件名: 项目名_v版本名_构建类型_打包时间.apk
def fileName = "XXX_v${defaultConfig.versionName}_${variant.buildType.name}_${getCurrentTime()}.apk"
//执行重命名操作
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
4.2 笔者习惯的apk命名模式为如下配置-gradle3.0以上:
applicationVariants.all { variant ->
variant.outputs.all {
if (variant.name.endsWith("release")) {
//重命名apk文件名: 项目名_v版本名_构建类型_打包时间.apk
outputFileName = "XXX_v${defaultConfig.versionName}_${variant.buildType.name}_${getCurrentTime()}.apk"
}
}
}
5、构建打包


结语
该解决方案为网络实现手段并结合自己习惯整理而成.权当抛砖引玉了,万望各位不吝赐教。
关于我
简书: AriesHoo
GitHub: AriesHoo
Email: AriesHoo@126.com
网友评论