我们在开发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. JButton

    JButton和Button区别: Button是在java.awt.*中的,而JButton是在javax.swing.*中,swing是awt的一个扩展,由纯java便携,它有一个与平台无关的实现 ...

  2. DataOutputStream&DataInputStream

    DataOutputStream&DataInputStream是对输出输入流的扩展,可以直接读写int double等数据类型 下面是今天的练习,细节都写到注释里面了: package Zh ...

  3. 解决使用web开发手机网页关于分辨率被缩放的坑

    问题的产生 因为各方面原因,要用网页做界面,开发一个APP.内核使用的是腾讯的x5内核. 把外壳交给前端和设计测试的时候,都汇报:状态栏的颜色太不搭配了,要求可修改 遂启用了安卓4.4版本开始支持的沉 ...

  4. Spring Security安全框架入门篇

    一.Spring Security相关概念 1.1..Spring Security介绍: Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安 ...

  5. 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。

    有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M. 需要选出若干个x,使这几个x的和与 M 最接近. 请描述实现算法,并指出算法复杂度. #define M 8 ...

  6. 理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(2)--SQL Server如何编译存储过程 在我们开始深入研究如何处理 ...

  7. MyEclipse如何全局搜索

    1全局搜索的启动方式 CTRL+H 2全局搜索自己选择搜索方式 自己选择要搜索的东西,简单吧,里面还有很多好玩的东西需要你去发现,加油! [正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之 ...

  8. ORACLE时间日期格式使用总结(参考网上资料汇总)

    Oracle时间日期操作 sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟 ...

  9. Android WebView选择本地文件上传

    This sample demonstrate android webview choose file to upload. I just implement the client code ,the ...

  10. 二维码扫描&集合排序

    一.二维码扫描机制 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构 ...