若干年前看到过,当时问了一圈身边的小朋友,他们都没有解决。不过这个问题实在并不重要,过后也就搁置了。刚刚在网上看代码,看到了实操案例,记录下来。
这个问题一开始思考的话,会发现有点悖论的意思。如果你的当前代码尚未提交,如何能在代码中置入提交哈希值(此处以 git 的工作方式为例)?如果你的代码已经提交,代码中要显示出来的提交哈希值从何而来?结论其实很明显,该哈希值需要在构建的时候自行获取,不能在代码中。因此主要的工作就体现在了构建脚本里。
在构建脚本里把以下函数加入(以使用 Groovy 语言的 gradle 脚本构建 Android 应用为例)build.gradle
,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
def getGitHash = { -> def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'rev-parse', '--short', 'HEAD' standardOutput = stdout } return stdout.toString().trim() } def getGitTag = { -> def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'describe', '--tags' standardOutput = stdout } return stdout.toString().trim() } def getCodeFromTag = { -> def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'describe', '--tags' standardOutput = stdout } return Integer.parseInt(stdout.toString().replace('.','').trim()) } |
然后在 defaultConfig
中加入语句 buildConfigField "String", "GIT_COMMIT", "\"${getGitHash()}\""
,此语句将在 BuildConfig
类中定义一个常量 GIT_COMMIT
,该常量的值即为调用上述函数之一后返回的提交哈希。在源代码中,像使用其他常量一样,在需要的地方直接引用 BuildConfig.GIT_COMMIT
即可。