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

如何以编程方式在Android应用程序中显示当前Git分支?,android,git,resources,virtual,Android,Git,Resources,Virtual,我想在Android应用程序的About对话框中显示GIT repo的当前哈希/分支引用。我可以手工复制,但用编程的方式复制更有趣 我有一个应用程序库,因此我的活动和应用程序继承自我自己的库类。因此,我想在我的库应用程序类中添加一个方法[getGitHash()]。我可以通过读取.git/HEAD来引用当前分支,它实际上在Eclipse项目下的res/raw文件中被引用(看看它是如何完成的)。我的项目现在有R.raw.HEAD资源 但是现在库不能引用R.raw.HEAD,所以我不能在库中实现该方

我想在Android应用程序的About对话框中显示GIT repo的当前哈希/分支引用。我可以手工复制,但用编程的方式复制更有趣

我有一个应用程序库,因此我的活动和应用程序继承自我自己的库类。因此,我想在我的库应用程序类中添加一个方法[getGitHash()]。我可以通过读取.git/HEAD来引用当前分支,它实际上在Eclipse项目下的res/raw文件中被引用(看看它是如何完成的)。我的项目现在有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


谢谢

这样做的方法是在ant构建文件中编写脚本。你应该检查各种各样的东西。我想在你的情况下,这正是你需要的。在要放置当前git分支的文件中放入某种唯一字符串,运行命令获取当前git分支,并用该命令的输出替换该唯一字符串。

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

更容易(无需任何插件),您可以通过在
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)

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

在build.gradle.kts文件中:

android{
默认配置{
编译DK版本(29)
applicationId=“xxx.xxxxxx.xxxx”
明斯克版本(21)
targetSdkVersion(29)
版本代码=3
versionName=“0.0.3”
resValue(“string”、“gitBranch”、getGitBranchName())
}
}
//用于读取当前git分支名称的函数
fun getGitBranchName():字符串{
val process=Runtime.getRuntime().exec(“git rev parse--abbrev ref HEAD”)
val sb:StringBuilder=StringBuilder()
while(true){
val char=process.inputStream.read()
如果(字符==-1)中断
sb.append(char.toChar())
}
把某人送回原处
}
然后您将有权访问名为
gitBranch
的新字符串res:

getString(R.string.gitBranch)

因此,虽然我还没有尝试过,但在ics引入的新开发工具中,库项目有点不同。可以通过创建存根文件覆盖内容,因为R中变量的值不再是最终值。在android应用程序项目的最终编译中,它应该成为最终版本。我还没有尝试过,但尽管这可能绕过了编译步骤,aapt可能实际上并没有始终如一地打包正确的内容。好吧,谢谢!这听起来像是要研究的东西,但我正在为这个项目研究2.2,我不知道这些工具与ICS实体的耦合程度。谢谢@kurtis nusbaum!我看到了一些关于ant任务的东西,但我甚至没有检查出来。现在我有了一个完美的借口。基本上,您所说的是编译之前的标签替换。我会尽可能快地试一下,我会尽可能快地试一下。谢谢
getString(R.string.gitBranch)