Android Gradle构建时如何动态读取对应flavor的versions.properties文件
实现动态读取对应flavor的version.properties文件方案
核心思路是通过Gradle提供的flavor/variant对象获取当前构建的flavor名称,自动拼接路径,完全不需要硬编码flavor名。
方案1:在productFlavors配置阶段读取(适合提前注入BuildConfig/资源的场景)
直接遍历所有已定义的flavor,自动匹配对应目录的配置文件:
android { flavorDimensions "default" productFlavors { // 定义你的三个flavor flavourOne {} flavourTwo {} flavourThree {} // 通用处理逻辑,新增flavor无需修改此处 all { currentFlavor -> def versionFile = file("${project.projectDir}/src/${currentFlavor.name}/version.properties") // 增加文件存在判断避免构建报错 if (versionFile.exists()) { def properties = new Properties() properties.load(new FileInputStream(versionFile)) // 示例:将配置写入BuildConfig,代码中可直接读取 buildConfigField "String", "VERSION_NAME", "\"${properties.getProperty("version_name")}\"" buildConfigField "int", "VERSION_CODE", "${properties.getProperty("version_code")}" // 也可以写入res资源、manifest占位符等,按需调整 } } } }
方案2:在构建Variant阶段读取(适合动态修改构建属性的场景)
如果需要修改variant的构建参数(比如动态改versionName/versionCode),可以监听applicationVariants回调处理:
android { // 你的原有配置... flavorDimensions "default" productFlavors { flavourOne {} flavourTwo {} flavourThree {} } } // 遍历所有构建变体,动态读取对应flavor的配置 android.applicationVariants.all { variant -> def currentFlavorName = variant.flavorName def versionFile = file("${project.projectDir}/src/${currentFlavorName}/version.properties") if (versionFile.exists()) { def properties = new Properties() properties.load(new FileInputStream(versionFile)) // 示例:动态修改当前变体的版本号 variant.mergedFlavor.versionName = properties.getProperty("version_name") variant.mergedFlavor.versionCode = properties.getProperty("version_code") as int } }
注意事项
- 两种方案都支持后续新增flavor,只要在对应
src/[flavor名]目录下放入version.properties即可,不需要修改逻辑代码 - 如果你使用了多flavor维度,可通过
variant.productFlavors获取所有维度的flavor名称,按需拼接路径即可
内容的提问来源于stack exchange,提问作者Favolas
相关产品推荐
相关产品推荐

