You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:20:06