使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM