Android项目中如何在BaseModule获取当前构建App的BuildConfig.VERSION_CODE
在BaseModule中获取当前应用VERSION_CODE的实现方案
方案一:依赖反转(推荐,符合模块化设计)
通过定义接口让App模块主动提供版本信息,BaseModule仅依赖接口,实现完全解耦:
- 在BaseModule中定义版本信息提供接口
// BaseModule 内的代码 interface AppVersionProvider { fun getVersionCode(): Int fun getVersionName(): String }
- 在BaseModule中创建全局持有类,用于保存接口实现
// BaseModule 内的代码 object AppGlobal { lateinit var versionProvider: AppVersionProvider // 增加初始化校验,避免未初始化导致崩溃 fun requireVersionProvider(): AppVersionProvider { check(::versionProvider.isInitialized) { "请先在Application中初始化AppVersionProvider" } return versionProvider } }
- 在每个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 }
- 在BaseModule中直接调用获取版本号
// BaseModule中任意需要的位置 val currentVersionCode = AppGlobal.requireVersionProvider().getVersionCode()
这个方案的核心是让App模块主动暴露自身的版本信息,BaseModule无需关心具体是哪个App,完全符合模块化依赖原则,且版本号直接取自App原生的BuildConfig,和直接调用的体验一致。
方案二:通过Gradle向BaseModule注入版本常量
如果需要让BaseModule拥有类似原生BuildConfig的直接可调用常量,可以通过Gradle脚本传递版本信息:
- 在每个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 } }
- 在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\"") } }
- 在BaseModule中直接调用常量
val versionCode = BuildConfig.CURRENT_APP_VERSION_CODE
注意:此方案需要每次切换构建的App模块时同步Gradle,且多App并行构建可能出现冲突,适合对直接调用常量有特殊需求的场景。
不推荐使用SharedPreferences的原因
SharedPreferences需要提前写入版本号,不仅增加初始化步骤,还存在写入失败、数据不一致的风险,远不如直接从App的BuildConfig中获取可靠。
内容的提问来源于stack exchange,提问作者Ansab
相关产品推荐
相关产品推荐

