我想在我的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
谢谢!
答案 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)