為什么要這么做
在應用開發的版本迭代過程中,通過版本號並不能快速定位到所對應的代碼,導致在后面分析問題追溯對應版本的代碼時比較麻煩。
如果代碼是通過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]
轉載鏈接:http://www.jianshu.com/p/582939dfd73e