能否独立于buildType或productFlavor设置resValue?
在Android中全局配置通用String资源(仅执行一次)
我之前也碰到过一模一样的需求,想要生成不随构建类型或产品风味变化的通用String资源,同时还要避免重复执行计算逻辑。其实只要两步就能轻松搞定:
1. 提前计算全局变量(仅执行一次)
把需要计算的值(比如Git哈希)放在模块build.gradle脚本的最外层,也就是android块之外。这样Gradle在解析脚本时只会执行一次计算,不会因为多个构建变体重复运行。
示例代码:
// 仅执行一次:获取当前Git提交的短哈希值 def gitHash = { -> def outputStream = new ByteArrayOutputStream() exec { commandLine 'git', 'rev-parse', '--short', 'HEAD' standardOutput = outputStream } return outputStream.toString().trim() }()
2. 在defaultConfig中配置全局资源
把生成的String资源放在android块下的defaultConfig里,因为所有buildType和productFlavor的变体都会继承defaultConfig的配置,这样这个资源会自动应用到所有构建中,不需要在每个变体里重复配置。
示例代码:
android { defaultConfig { // 全局配置通用String资源,所有构建变体共享 resValue "string", "source_git_hash", gitHash // 你的其他默认配置(applicationId、minSdkVersion等) } // 你的buildTypes配置 buildTypes { release { minifyEnabled true // ... 其他发布配置 } debug { debuggable true // ... 其他调试配置 } } // 你的productFlavors配置(如果有的话) productFlavors { free { // ... 免费版配置 } paid { // ... 付费版配置 } } }
为什么这样有效?
- 外层的
gitHash计算逻辑只会在Gradle初始化脚本时执行一次,不会因为多个构建变体重复运行,既高效又保证值的统一性。 defaultConfig是所有构建变体的基础配置,这里定义的resValue会被每个变体自动继承,完全不需要在buildTypes.all或productFlavors.all里重复写代码。
之后你就可以在代码里像使用普通String资源一样调用R.string.source_git_hash,不管是debug、release还是任何产品风味的构建,拿到的都是同一个Git哈希值。
内容的提问来源于stack exchange,提问作者david.mihola
相关产品推荐
相关产品推荐

