標籤:編譯 ref 工具介紹 版本號碼 evel 分支 索引 tco exce
為什麼要這麼做
??在應用開發的版本迭代過程中,通過版本號碼並不能快速定位到所對應的代碼,導致在後面分析問題追溯對應版本的代碼時比較麻煩。
??如果代碼是通過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
使用gradle構建Android時 版本號碼versionName中嵌入git提交資訊