如何以编程方式在Android应用程序中显示当前的Git分支?

时间:2011-10-27 04:53:35

标签: android git resources virtual

我想在我的Android应用程序的“关于”对话框中显示GIT仓库的当前哈希/分支参考。我可以手工复制它,但以编程方式执行它会更有趣。

我有一个用于我的应用程序的库,所以我的活动和我的应用程序继承自我自己的库类。所以,我想在我的库应用程序类中添加一个方法[getGitHash()]。我可以通过读取.git / HEAD来引用当前分支,它在Eclipse项目下的res / raw文件中被虚拟引用(查看here以查看它是如何完成的)。我的项目现在有R.raw.HEAD资源。

但是现在库无法引用R.raw.HEAD,所以我无法在库中实现该方法。库中的方法应该是这样的:

public static String getGitHash(int nDigits) {

    String hash = "";
    SB_ResourceReader.LoadRAWFile(R.raw.HEAD,SB_Application.getContext());
    return hash;
}

.LoadRAWFile()是一个读取原始文件内容的静态方法,SB_Application.getContext()是另一个要检索的静态方法......好吧,应用程序上下文。

虽然在编译时无法访问,但是库是否可以“信任”某个资源?

我希望自己解释过:S

谢谢!

4 个答案:

答案 0 :(得分:2)

如果您正在使用eclipse,请尝试以下操作:将.git文件夹添加为源文件夹,并将包含模式添加为“HEAD”。这将导致HEAD文件作为资产(不是android资源!)存储在jar中。您可以使用getClass()。getResourceAsStream(“/ HEAD”)方法访问它:

    try {
        InputStream is = getClass().getResourceAsStream("/HEAD");
        byte buff[] = new byte[256];
        int len = is.read(buff);
        String s = new String(buff, 0, len);
        System.out.println("!!! HEAD: " + s);
    } catch (Exception e) {
        e.printStackTrace();
    }

答案 1 :(得分:1)

更轻松(没有任何插件),您可以通过在app.gradle中设置新资源来实现此目的:

android {
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1"
        resValue "string", "gitBranch", gitBranch()
    }
    buildTypes {...}
}


def gitBranch() {
    def branch = ""
    def proc = "git rev-parse --abbrev-ref HEAD".execute()
    proc.in.eachLine { line -> branch = line }
    proc.err.eachLine { line -> println line }
    proc.waitFor()
    branch
}

因此,您可以访问新字符串资源

getString(R.string.gitBranch)

答案 2 :(得分:0)

所以这样做的方法是在你的ant构建文件中编写脚本。你应该检查各种ant file tasks。我想在你的情况下ReplaceRegEx正是你所需要的。在文件中放置一些唯一的字符串,您可以在其中放置当前的git分支,运行命令以获取当前的git分支,并将该唯一字符串替换为该命令的输出。

答案 3 :(得分:0)

感谢@Hugo Gresse的回答。如果您使用的是 gradle.kts(Kotlin),则需要进行以下修改:

在您的 build.gradle.kts 文件中:

    android {
        defaultConfig {
            compileSdkVersion(29)
            applicationId = "xxx.xxxxxx.xxxx"
            minSdkVersion(21)
            targetSdkVersion(29)
            versionCode = 3
            versionName = "0.0.3"
            resValue("string", "gitBranch", getGitBranchName())
        }
    }

    // function to read current git branch name
    fun getGitBranchName(): String {
        val process = Runtime.getRuntime().exec("git rev-parse --abbrev-ref HEAD")
        val sb: StringBuilder = StringBuilder()
        while (true) {
            val char = process.inputStream.read()
            if (char == -1) break
            sb.append(char.toChar())
        }
        return sb.toString()
    }

然后,您将可以访问名为gitBranch的新字符串res:

getString(R.string.gitBranch)