使用gradle构建Android时 版本号versionName中嵌入git提交信息

Posted 骑猪撞交警

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用gradle构建Android时 版本号versionName中嵌入git提交信息相关的知识,希望对你有一定的参考价值。

为什么要这么做

??在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦。
??如果代码是通过git来管理的,git的commit id等信息是能够快速定位到响应代码的。如果能够在构建应用的时候自动将commit id嵌入到versionName中去,对后续的追溯是有很大帮助的。
??以下以主流的gradle构建工具介绍。

可行的办法

  1. 可以通过gradle调用git命令获取当前仓库状态,拼接到versionName里面
    如通过git describe --always获取形如origin/develop.2.0.1017-2-g0327583(有tag存在)或0327583(无tag存在)
    或者通过git rev-parse HEAD获取形如90312cd9157587d11779ed7be776e3220050b308,或通过git rev-parse --short HEAD获取短的90312cd9.
  2. 方法1使用起来很方便,但是需要依赖构建环境是有git且配置完全正确,实际在windows上可能会出现命令行中编译OK,在android Studio中却执行失败的情况。因此这里介绍的方法是在代码仓库相对路径里自己解析git commit id信息拼装到versionName中。

步骤介绍

提取git commit id

gradle脚本里面提取git commit id

gradle.allprojects {
    ext.getGitHeadRefsSuffix = {
        try {
            // .git/HEAD描述当前目录所指向的分支信息,内容示例:"ref: refs/heads/master\n"
            def headFile = new File(‘.git/HEAD‘)
            if (headFile.exists()) {
                String[] strings = headFile.getText(‘UTF-8‘).split(" ");
                if (strings.size() > 1) {
                    String refFilePath = ‘.git/‘ + strings[1];
                    
                    // 根据HEAD读取当前指向的hash值,路径示例为:".git/refs/heads/master"
                    def refFile = new File(refFilePath.replace("\n", ""));

                    // 索引文件内容为hash值+"\n",
                    // 示例:"90312cd9157587d11779ed7be776e3220050b308\n"
                    return "_" + refFile.getText(‘UTF-8‘).substring(0, 7)
                }

            }
        } catch (Exception e) {
            e.printStackTrace()
        }
        return ""
    }
}

将上述保存到公共的common.gradle脚本中,供后续使用。

project中导入

project的build.gradle中导入

apply from: ‘common.gradle‘

module引用

在module中根据需要引用定义的方法

android {
    ....
    defaultConfig {
        ....
        versionName "2.0_" + getGitHeadRefsSuffix()
        ....
    }
    ....
}

检验

构建安装后确认应用的版本信息,形如:

....
versionName=2.0_14e1535
....

如果需要跟踪到对应版本的代码,可以在git仓库中直接

git checkout 14e1535 [-b $branchname]



转载链接:http://www.jianshu.com/p/582939dfd73e









以上是关于使用gradle构建Android时 版本号versionName中嵌入git提交信息的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件Gradle 依赖管理 ⑤ ( dependencies 依赖项拆分 | 依赖组 | 依赖名称 | 依赖版本号 | 动态指定依赖版本号 | 使用命令行查看模块 )

Android编译gradle 动态修改版本号

Android Gradle 插件自定义 Gradle 插件模块 ② ( 在模块中定义插件 | 引入自定义 Gradle 插件模块 | 配置 Gradle 插件上传选项 | 配置分组名称版本号 )

Android Gradle:在构建时动态更改版本名称

Android Studio中Gradle统一管理版本号引用配置

android studio gradle dependencies 包存放在哪儿