为什么要这么做

  在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦。
  如果代码是通过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提交信息的更多相关文章

  1. 使用Gradle构建Android项目

    阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ...

  2. 用Gradle 构建android程序

    前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ...

  3. 在内网使用Gradle构建Android Studio项目

    在Android Studio项目中,默认的远程仓库为jcenter,如果在项目引用了一些类库,Gradle构建程序的时候会将这些依赖类库从jcenter网站下载到本地,如我们在 build.grad ...

  4. gradle构建android项目详解

    1.用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了. 根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这 ...

  5. 使用Gradle构建Android应用内测版本

    在开发应用的过程中,有时候需要比较当前线上版本和正在开发中的版本差异,目前的做法只能是在两个不同的设备上面安装线上版本和开发中的版本,因为当前版本在调试过程中会覆盖旧版本.本文通过使用gradle来构 ...

  6. windows下cmd时复制dos中的内容 错误信息等

    16:28 2015/11/23小发现 windows下cmd时复制dos中的内容,错误信息等:鼠标右键选择标记,然后ctrl c 即可.

  7. Android Studio右键选项中没有Git?

    从Git clone一个Project并打开后,都会习惯性的像使用Eclipse一样,选中project右键,选择Git的相应版本号控制选项. 例如以下图,你仅仅看到了svn. 怎样配置才干在右键选项 ...

  8. 在 Git 提交信息中使用 Emoji

    Gitmoji 旨在解释如何在 Git 提交消息时使用表情符号.在提交信息时使用表情符号,可以更容易地识别提交的目的或意图. Emoji 列表 :优化项目结构 / 代码格式 :art: ️ :性能提升 ...

  9. Eclipse中使用GIT提交文件至本地

    GIT提交文件至本地: 1.  右击项目——Team——Commit…: 2.在弹出的Commit Changes框中——选择要提交的文件——填写提交说明——点击Commit,即可提交至本地.

随机推荐

  1. 如何在eclipse 中安装 spring IDE

    1.先 确定 当前的eclipse 的版本:(步骤如下) 2.下载spring ide(请确定好ecplice 的版本号) http://spring.io/tools/sts/all 最后:  安装 ...

  2. ShiroFilterFactoryBean分析

    创建核心Filter 同其他框架一样,都有个切入点,这个核心Filter就是拦截所有请求的. 通过web.xml中配置的Filer进入,执行init方法获取这个instance,调用下面的create ...

  3. bytes2HexString

    public static String bytes2HexString(byte[] b) { String r = ""; for (int i = 0; i < b.l ...

  4. 【BZOJ 1004】【HNOI 2008】Cards

    http://www.lydsy.com/JudgeOnline/problem.php?id=1004 注意数据给出的m是一个没有单位元的置换群! 用Burnside引理,然后对每个置换群dp一下就 ...

  5. [BZOJ3167][P4099][HEOI2013]SAO(树形DP)

    题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...

  6. 【推导】【构造】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem E. Space Tourists

    给你n,K,问你要选出最少几个长度为2的K进制数,才能让所有的n位K进制数删除n-2个元素后,所剩余的长度为2的子序列至少有一个是你所选定的. 如果n>K,那么根据抽屉原理,对于所有n位K进制数 ...

  7. 【并查集】POJ2236-Wireless Network

    [题目大意] 已知每一台电脑只能与它距离为d的电脑相连通,但是两台电脑间可以以第三台作为媒介连接.现在电脑全被损坏.每次可以进行两个操作中的一个,或是修好一台电脑,或是查询两台电脑是否连通. [思路] ...

  8. [NOIp2016提高组]换教室

    题目大意: 有n节课,第i节课在c[i]上课,同时d[i]也有一节课d[i]. 你有权利向教务处发出m次申请把自己的教室改到d[i],相应的批准概率是k[i]. 教室是图上的一些点,其中每条边都有边权 ...

  9. Problem F: 调用函数,判断各位数字立方和是否等于它本身

    #include<stdio.h> #include<math.h> int is(int number)//定义函数 { ; ) { s=number%; sum=sum+p ...

  10. codevs 1349 板猪的火车票

    1349 板猪的火车票  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 奸商zn(请勿对号入座)开办了一家火车公司,弱弱的板猪 ...