我们在开发App时,通常在项目的Release阶段我们需要设置应用的版本号和版本名称,也就是设置下面两个属性

versionCode

versionName

版本号

其中versionCode的值是int类型,主要作用就是作为应用内部的版本编号,为版本升级提供唯一的标识,通常设为是自增的,假如当前app的versionCode为1,下一代app的versionCode为2,那么就可以通过它来判断应用是否需要升级、是否有新版本,也就是versionCode的值越大那么app就越新。它通常是对用户不可见的,因为它只是一个int类型值,显示出来无任何意义

versionName的值是String类型,它就是版本的名称,通常叫做版本号,是提供给用户看的,以便供用户知道当前自己安装的是哪个版本的app,一般在app的设置界面和应用市场上我们看到的版本号就是这个

手动管理产生的问题

假设当前版本是这样的:

defaultConfig {
            applicationId "com.sunzxy.sunzxyongdemo"
            minSdkVersion 16
            targetSdkVersion 23
            versionCode 11246
            versionName "6.0.1"
        }

它的versionCode为11246,现在已经非常大了,通常我们手动去记住这个versionCode和对应的versionName比较容易出错,而且随后期迭代的非常多的时候,这时候非常混乱,而versionCode(Name)出错则会导致不可预料的后果:

1、新Release的应用versionCode比旧版的versionCode小,导致app升不了级,新Release的应用使用了同一个的versionName,导致用户不升级

2、手动管理的话,假如其中一个工程师一不小心把下一代app的versionCode误写成了12246,而再下一版的是另外一个工程师发布的,如果versionCode还是按最开始的自增,那么versionCode为11248,当应用发布出去,包括所有versionCode小于12247的应用用户将都升不了级,唯一的办法就是把今后迭代的app的versionCode从12246以后开始自增

通过gradle自动管理应用程序版本

上面我们说了采用人工的方式去管理应用的版本是比较容易出错的,所以既然手动管理不行,那么就采取自动管理的方式去管理吧,而versionCode的作用就是提供一个int类型的版本标识供应用升级,而每一次release的时候这个versionCode都应该确保比旧版本的值大,所以可以通过在release时候让versionCode自动+1来确保这个版本是最新的版本,而这个工作则是由gradle来完成的。

我们在Module目录下新建一个version.properties文件作为存储versionCode文件,里面我们给它一个初始值为

VERSION_CODE=1

然后在Module目录下的gradle配置这样一段代码:

    def versionPropsFile = file("version.properties")
    if (versionPropsFile.canRead()) {

        Properties versionProps = new Properties()
        versionProps.load(new FileInputStream(versionPropsFile))

        def runTasks = gradle.startParameter.taskNames
        def int verCode = versionProps['VERSION_CODE'].toInteger()
        if (':app:assembleRelease' in runTasks) {
            versionProps['VERSION_CODE'] = (verCode + 1).toString()
            versionProps.store(versionPropsFile.newWriter(), null)
        }
        defaultConfig {
            applicationId "com.sunzxy.sunzxyongdemo2"
            minSdkVersion 16
            targetSdkVersion 23
            versionCode verCode
            versionName "1.2"
        }
    } else {
        throw new GradleException("Could not read version.properties!")
    }

那么当我们release这个项目时候,每release一次这个versionCode将会自动加1,如下我release了一次,它自动加了1

通过gradle自动管理versionCode,我们无需手动修改这个versionCode了,只需要在release时候把版本号versionName更新即可

版本控制—使用Gradle自动管理应用程序版本的更多相关文章

  1. Xcode快照——管理应用程序版本

    转自:http://blog.csdn.net/yuanbohx/article/details/8919474 1.创建快照:FIle → Create Snapshot 2.查看快照:Window ...

  2. c/s程序版本自动升级的问题,如何判断client端版本号是否最新,然后从指定ftp服务器down

    c/s程序版本自动升级的问题,如何判断client端版本号是否最新,然后从指定ftp服务器down http://blog.csdn.net/delphizhou/article/details/30 ...

  3. 版本控制git之五-标签管理 tags 标签 代码版本 如: v1.0

      版本控制git之五-标签管理 打标签 像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要. 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等). ...

  4. 【Gradle】配置中引用的jar包版本后面自动加冒号导致引入jar包失败的问题/gradle中引用jar包版本不一致的问题/gradle中引用jar失败的问题 解决方法

    idea中 gradle中 引用jar包,版本后面默认加:的问题 gradle中引用jar包版本不一致的问题 gradle中引用jar失败的问题 如上题目所示,三个问题其实都是同一样的简单又恶心,因为 ...

  5. Oracle DB 自动管理共享内存

    • 启用Oracle Enterprise Manager (EM) 内存参数 • 设置自动优化的内存参数 • 使用手动优化的SGA 参数覆盖最小大小 • 使用SGA Advisor 设置SGA_TA ...

  6. C# 多线程的自动管理(线程池) 基于Task的方式

    C# 多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况:    1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应.这一般使用 ThreadPool(线程 ...

  7. java testng框架的windows自动化-自动运行testng程序上篇

    本文旨在让读者简单了解testng的自动运行 怎么说呢,在网上已经有了各个前辈进行代码演示以及分享,我力争说到点子上 接上文,之前讲的大部分是juint的自动化代码运行,从未涉及到testng,但是在 ...

  8. 用Total Commander for Android管理应用程序

    用Total Commander for Android管理应用程序 前不久安装了一个Total Commander的Anroid版本,除了用它来管理文件之外,我发现用它管理已安装程序挺不错的. 可以 ...

  9. [Clr via C#读书笔记]Cp2生成打包部署和管理应用程序和类型

    Cp2生成打包部署和管理应用程序和类型 部署问题 DLL Hell;安装的复杂性:安全性:代码访问安全性. csc.exe的简单使用. 元数据 定义表:引用表:清单表: 程序集 重用,版本控制,安全的 ...

随机推荐

  1. C语言 分支与循环 递推思想 穷举 流程的转移控制

    条件语句 开关控制语句(SWITCH语句) 象坐电梯一样,break是按的楼层,不加break则会一直执行下去. 上面程序有细节BUG,边界测试输入-5,105时由于整除会得到错误的结果. 解决方法: ...

  2. static class 静态类(Java)

    一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static ...

  3. 正则替换replace中$1的用法以及常用正则

    一.repalce定义 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. stringObject.replace(regexp/substr,replacement)参数一 ...

  4. Uncaught RangeError: Maximum call stack size exceeded-栈溢出

    在看函数的arguments对象的时候,用了arguments.callee写了一个递归. 当执行函数func(99999)时候,直接报错了,一看,原来栈溢出了. 当执行递归运算的时候,忘记加点判断条 ...

  5. 模仿天猫实战【SSM版】——项目起步

    前言:现在自己的学习似乎遇到了瓶颈,感觉学习了 SSM 之后有一些迷茫,不知道接下来该往哪里去努力了,我觉得这是个很不好的状态,为了度过这段时期,我准备把天猫模仿下来(给自己找点事做)之后开始去巩固 ...

  6. 异常处理&RandomAccessFile&节奏感

    异常处理 异常处理方面的知识,下面是学习中记的笔记: try尝试捕获异常 catch对捕获的异常进行处理 多个catch要注意的问题: 一.顺序问题,先小后大,也就是先子类后父类.因为当异常出现的时候 ...

  7. Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况

    由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...

  8. ACM Robot Motion

      机器人已被编程为按照其指令中的路径进行操作.机器人要移动的下一个方向的指令放在网格中.可能的指令是 N north (up the page) S south (down the page) E ...

  9. mybatis常用配置

    前面两篇博客我们简单介绍了mybatis的使用,但是在mybatis的配置问题上我们只是使用了最基础的配置,本文我们就来说说其他一些常用的配置.如果小伙伴对mybatis尚不了解,可以先参考这两篇博客 ...

  10. Spring常用配置

    ----------------------------------------------------------------------------------------------[版权申明: ...