为什么要这么做
在应用开发的版本迭代过程中,通过版本号并不能快速定位到所对应的代码,导致在后面分析问题追溯对应版本的代码时比较麻烦。
如果代码是通过git来管理的,git的commit id等信息是能够快速定位到响应代码的。如果能够在构建应用的时候自动将commit id嵌入到versionName中去,对后续的追溯是有很大帮助的。
以下以主流的gradle构建工具介绍。
可行的办法
- 可以通过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
. - 方法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]
网友评论