Android Gradle配置版本号自增并生成对应apk总结


前言

相信大家开发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

转载于:https://juejin.im/post/5abb244d5188255587239a3b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值