我们在开发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# 操作数据库

    查询 string strConnection = "Data Source=(local);Initial Catalog=zpractice;Integrated Security=SS ...

  2. 一口一口吃掉Hibernate(七)——继承映射

    前几篇博文中讲到了常用的几种关联映射.其实hibernate中还有一种"省劲儿"的映射,那就是--"继承映射". 学了这么多的关系映射了,继承映射,从字面上也能 ...

  3. C# 虹软SDK视频人脸识别和注册

    一,准备工作 1.Afoge视频参数类 using AForge.Video.DirectShow; using System; using System.Collections.Generic; u ...

  4. Create database 创建数据库

    首先在ORACLE用户下进入.bash_profile文件 [oracle@linux02 ~]$ vi .bash_profile export ORACLE_SID=hldbexport ORAC ...

  5. ubuntu批量更改文件权限

    重装系统之后,把文件从windows分区拷到linux分区发现所有文件的权限全是777,在终端下看到所有文件的颜色都很刺眼,文件有很多,一个一个改不现实,所以写了一段python脚本批量更改文件权限. ...

  6. 服务器&阵列卡&组raid 5

    清除raid信息后,机器将会读不到系统, 后面若进一步操作处理, raid信息有可能会被初始化掉,那么硬盘数据就有可能会被清空, 导致数据丢失, 否则如果只是清除raid信息,重做raid是可以还原系 ...

  7. python学习之路网络编程篇(第四篇)- 续

    Memcache简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...

  8. 如何搭建ssh服务?

    为了日后便于查询,本文所涉及到的所有命令集合如下: rpm -qa | grep openssh #查看是否安装了openssh软件 service sshd status #服务端的ssh状态 if ...

  9. sshpass笔记

    sshpass简介 ssh登录的时候使用的是交互式输入,不能预先在命令行使用参数指定密码,sshpass就是为了解决这个问题的.sshpass提供非交互式输入密码的方式,可以用在shell脚本中自动输 ...

  10. Linux(八)用户管理

    8.1 基本介绍 Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账户,然后以这个账户身份进入系统. Linux的用户需要至少要属于一个组. 8 ...