Android应用与库之间共享版本信息等变量的最优方案
Android应用与库共享版本信息的最优方案
以下几种方案都能满足在Gradle脚本和Kotlin代码(如BuildConfig)中共享版本号、版本名称的需求,按推荐程度排序:
1. Version Catalog(Gradle 7.0+ 官方推荐)
这是目前Gradle官方主推的版本管理方式,类型安全且维护方便:
- 在根目录的
settings.gradle.kts中定义版本信息:
dependencyResolutionManagement { versionCatalogs { create("libs") { version("app-version-code", "100") version("app-version-name", "1.0.0") } } }
- 在应用或库模块的
build.gradle.kts中引用并注入BuildConfig:
android { defaultConfig { // Gradle脚本中直接使用 versionCode = libs.versions.app.version.code.get().toInt() versionName = libs.versions.app.version.name.get() // 注入到BuildConfig,供Kotlin代码调用 buildConfigField("int", "APP_VERSION_CODE", libs.versions.app.version.code.get()) buildConfigField("String", "APP_VERSION_NAME", "\"${libs.versions.app.version.name.get()}\"") } }
2. buildSrc 定义常量 + 注入BuildConfig
buildSrc适合需要复用复杂Gradle逻辑的场景,解决你之前遇到的问题的正确姿势是:
- 在项目根目录创建
buildSrc/src/main/kotlin/Versions.kt,定义常量:
object Versions { const val APP_VERSION_CODE = 100 const val APP_VERSION_NAME = "1.0.0" }
- 在模块的
build.gradle.kts中引用并注入BuildConfig:
android { defaultConfig { // Gradle脚本中直接使用 versionCode = Versions.APP_VERSION_CODE versionName = Versions.APP_VERSION_NAME // 注入到BuildConfig,供Kotlin代码调用 buildConfigField("int", "APP_VERSION_CODE", "${Versions.APP_VERSION_CODE}") buildConfigField("String", "APP_VERSION_NAME", "\"${Versions.APP_VERSION_NAME}\"") } }
这里不需要手动修改compileClasspath——buildSrc的代码是Gradle脚本的依赖,天然能在脚本中引用;而Kotlin代码需要的是通过buildConfigField生成的字段,不是直接引用buildSrc的类。
3. gradle.properties + 扩展属性
如果不想用buildSrc或Version Catalog,这种方式简单直接:
- 在根目录的
gradle.properties中定义版本信息:
APP_VERSION_CODE=100 APP_VERSION_NAME=1.0.0
- 在根项目的
build.gradle.kts中声明扩展属性(可选,提升可读性):
val appVersionCode by extra { APP_VERSION_CODE.toInt() } val appVersionName by extra { APP_VERSION_NAME }
- 在模块的
build.gradle.kts中引用并注入BuildConfig:
android { defaultConfig { versionCode = rootProject.extra["appVersionCode"] as Int versionName = rootProject.extra["appVersionName"] as String buildConfigField("int", "APP_VERSION_CODE", "${rootProject.extra["appVersionCode"]}") buildConfigField("String", "APP_VERSION_NAME", "\"${rootProject.extra["appVersionName"]}\"") } }
这种方式的缺点是类型安全稍弱,需要手动强转类型。
内容的提问来源于stack exchange,提问作者falsetto
相关产品推荐
相关产品推荐

