Gradle使用详解(五) 之 动态生成APP版本号

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyz_zyx/article/details/83418900

我们清楚知道,几乎所有的软件都是存在一个版本号的东西,APP作为手机上的应用软件也不例外。版本号可以帮助APP升级使用和定位问题。一般地,版本号有3部分构成:主版本号、副版本号 以及 补丁号,例如:1.0.123。也可以是单一个主版本号,格式没有严格要求。

方法一、直接配置在build.gradle文件

我们在前面的博文《Gradle使用详解(三) 之 Android Gradle插件配置详解》中有提到,在Android Gradle中配置版本相关信息主要是给defaultConfig配置块中指定versionCode和verionName两个字段,例如:

android {
    ……
    defaultConfig {
        ……
        versionCode 1
        versionName "1.0"
    }
}

这种方式最直观,也最粗暴。它存在一个很大的问题,就是当我们的buidl.gradle文件代码越来越多时就会不容易查找,而且修改一旦只为修改一个版本号而导致出错或版本冲突的代价很高。所以一般我们是不建议这样做的。

方法二、脚本插件配置

还记得我们在前面博文《Gradle使用详解(二) 之 项目结构和初识Java Gradle插件》中介绍脚本插件吗?应用脚本插件,其实就是把这个脚本加载进来,它使用的是关键字from,后面紧跟的是一个脚本文件,例如在build.gradle同级目录中新建一个version.gradle文件,内容如下:

ext {
   appVersionName = '1.0.0'
   appVersionCode = 100
}

然后修改build.gradle内容,在开始时使用apply from加载version.gradle脚本文件,然后为 versionCodeversionName字段指向appVersionNameappVersionCode两个变量:

apply from:'version.gradle'

android {
    ……
    defaultConfig {
        ……
        versionCode appVersionCode
        versionName appVersionName
    }
}
这样我们把APP的版本号和版本名称单独放在一个脚本文件里。以后每次APP发版本只需要更改version.gradle文件即可。这种方式的使用比较广泛。

方法三、从git的tag中自动获取版本号

如果你的项目开发是使用gif进行版本控制的话,在每次发布版本时一般情况下都会进行版本分支的创建和打上相应的Tag。这样做的好处就是在新版本的发布的时候能清楚记录版本截止到的功能点,同时也不会因为发布当前版本而停下来,导致影响团队其他人在主干上的继续开发。后续若存在修改BUG等操作再另外同步回主干,这样做是非常便于团队合作。

我们在创建Tag时若是使用版本名称来命名,就可以通过git命令很简单经获得该Tag来作为版本名称。命令如下:

git describe --abbrev=0 –tags

至于版本号,我们可以通过命令来获取历史所有的Tag数量,这样也刚好每次创建Tag后,版本号就加1,符合版本号的递增逻辑。要获取Tag数量数量可以使用命令:

git tag –list

清楚思路后后,接下来就是修改build.gradle内容,即定义两个获得版本名称和版本号的方法,然后对versionCodeversionName字段进行指定:

def getAppVersionName() {
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--abbrev=0', '--tags'
        standardOutput = stdout
    }
    return stdout.toString()
}
def getAppVersionCode(){
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git','tag','--list'
        standardOutput = stdout
    }
    return stdout.toString().split("\n").size()
}
def appVersionName = getAppVersionName()
def appVersionCode = getAppVersionCode();
android {
    ……
    defaultConfig {
        ……
        versionCode appVersionCode
        versionName appVersionName
    } 
}

通过这种方式,我们只需要在发布版本打包前,给代码分支创建一个以版本名称作为命名的Tag,然后Android Gradle在打包时就会自动生成应用的版本名称和版本号,不需要修改一行代码非常方便,也不用担心因为写错版本信息而担心。

 

——本文部分内容参考自《Android Gradle权威指南》

猜你喜欢

转载自blog.csdn.net/lyz_zyx/article/details/83418900