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

Android项目中如何在BaseModule获取当前构建App的BuildConfig.VERSION_CODE

在BaseModule中获取当前应用VERSION_CODE的实现方案

方案一:依赖反转(推荐,符合模块化设计)

通过定义接口让App模块主动提供版本信息,BaseModule仅依赖接口,实现完全解耦:

  1. 在BaseModule中定义版本信息提供接口
// BaseModule 内的代码
interface AppVersionProvider {
    fun getVersionCode(): Int
    fun getVersionName(): String
}
  1. 在BaseModule中创建全局持有类,用于保存接口实现
// BaseModule 内的代码
object AppGlobal {
    lateinit var versionProvider: AppVersionProvider

    // 增加初始化校验,避免未初始化导致崩溃
    fun requireVersionProvider(): AppVersionProvider {
        check(::versionProvider.isInitialized) { "请先在Application中初始化AppVersionProvider" }
        return versionProvider
    }
}
  1. 在每个App模块的Application类中实现接口并初始化
// App1的Application类
class App1Application : Application(), AppVersionProvider {
    override fun onCreate() {
        super.onCreate()
        AppGlobal.versionProvider = this
    }

    override fun getVersionCode(): Int = BuildConfig.VERSION_CODE
    override fun getVersionName(): String = BuildConfig.VERSION_NAME
}

// App2的Application类同理
class App2Application : Application(), AppVersionProvider {
    override fun onCreate() {
        super.onCreate()
        AppGlobal.versionProvider = this
    }

    override fun getVersionCode(): Int = BuildConfig.VERSION_CODE
    override fun getVersionName(): String = BuildConfig.VERSION_NAME
}
  1. 在BaseModule中直接调用获取版本号
// BaseModule中任意需要的位置
val currentVersionCode = AppGlobal.requireVersionProvider().getVersionCode()

这个方案的核心是让App模块主动暴露自身的版本信息,BaseModule无需关心具体是哪个App,完全符合模块化依赖原则,且版本号直接取自App原生的BuildConfig,和直接调用的体验一致。

方案二:通过Gradle向BaseModule注入版本常量

如果需要让BaseModule拥有类似原生BuildConfig的直接可调用常量,可以通过Gradle脚本传递版本信息:

  1. 在每个App模块的build.gradle.kts中设置版本信息到全局扩展属性
// App1/build.gradle.kts
// 定义全局版本属性
project.ext.apply {
    set("appVersionCode", 100)
    set("appVersionName", "1.0.0")
}

android {
    defaultConfig {
        // 同步App自身的版本配置
        versionCode = project.ext["appVersionCode"] as Int
        versionName = project.ext["appVersionName"] as String
    }
}
  1. 在BaseModule的build.gradle.kts中读取全局属性并生成BuildConfig字段
// BaseModule/build.gradle.kts
android {
    // 开启BuildConfig生成
    buildFeatures {
        buildConfig = true
    }

    defaultConfig {
        // 读取全局属性,设置默认值避免构建报错
        val appVersionCode = project.ext.getOrDefault("appVersionCode", 0) as Int
        val appVersionName = project.ext.getOrDefault("appVersionName", "0.0.0") as String

        // 生成BaseModule的BuildConfig常量
        buildConfigField("int", "CURRENT_APP_VERSION_CODE", appVersionCode.toString())
        buildConfigField("String", "CURRENT_APP_VERSION_NAME", "\"$appVersionName\"")
    }
}
  1. 在BaseModule中直接调用常量
val versionCode = BuildConfig.CURRENT_APP_VERSION_CODE

注意:此方案需要每次切换构建的App模块时同步Gradle,且多App并行构建可能出现冲突,适合对直接调用常量有特殊需求的场景。

不推荐使用SharedPreferences的原因

SharedPreferences需要提前写入版本号,不仅增加初始化步骤,还存在写入失败、数据不一致的风险,远不如直接从App的BuildConfig中获取可靠。

内容的提问来源于stack exchange,提问作者Ansab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:06