编译时在Android应用中存储Git Hash的Gradle适配问题
解决Gradle 8.2+配置阶段执行Git命令报错的问题
这不是升级操作的问题,是Gradle 8.2版本开始严格限制了配置阶段的外部进程调用——之前在配置阶段通过exec执行git rev-parse --short HEAD的方式不再被允许,必须调整为在执行阶段获取Git哈希。
具体调整方案
方案一:直接在BuildConfig生成任务的执行阶段获取哈希
不需要额外任务,直接将Git命令移到BuildConfig生成任务的doFirst块中(doFirst属于执行阶段逻辑):
android { // 保留原有其他配置 applicationVariants.all { variant -> variant.generateBuildConfigProvider.configure { provider -> provider.doFirst { // 执行Git命令获取短哈希 def gitHash = "git rev-parse --short HEAD".execute().text.trim() // 将哈希写入BuildConfig buildConfigField("String", "GIT_HASH", "\"${gitHash}\"") } } } }
方案二:独立任务+依赖关联(适合复杂场景)
如果需要在多个地方复用Git哈希,可以单独定义任务,再让BuildConfig生成任务依赖它:
- 定义获取Git哈希的任务
tasks.register("fetchGitHash") { outputs.upToDateWhen { false } // 确保每次构建都重新获取最新哈希 doLast { def gitHash = "git rev-parse --short HEAD".execute().text.trim() // 将哈希写入临时文件 file("$buildDir/intermediates/git-hash.txt").text = gitHash } }
- 让BuildConfig生成任务依赖该任务并读取哈希
android { // 保留原有其他配置 applicationVariants.all { variant -> variant.generateBuildConfigProvider.configure { provider -> provider.dependsOn(tasks.fetchGitHash) provider.doFirst { def gitHash = file("$buildDir/intermediates/git-hash.txt").text.trim() buildConfigField("String", "GIT_HASH", "\"${gitHash}\"") } } } }
验证
同步Gradle后重新构建项目,Java代码中即可正常通过BuildConfig.GIT_HASH获取Git短哈希,同时不会再出现配置阶段执行外部进程的错误。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

