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

如何在Android Library模块中获取version code与version name?

问题原因说明

Android Library模块默认不会将build.gradle中定义的versionCode、versionName自动生成到BuildConfig类中,只有Application类型的模块才会默认生成这两个字段,这是AGP的默认行为,不是配置错误。

以下是3种可行的实现方案:

方案1:手动在Library模块生成自定义BuildConfig字段

如果需要读取的是当前Library模块自身的版本信息,直接手动配置BuildConfig字段即可:

  1. 首先开启Library模块的BuildConfig生成能力(AGP 4.1+默认关闭Library模块的BuildConfig生成),在模块的build.gradle中添加如下配置:
android {
    defaultConfig {
        // 手动添加自定义版本字段到BuildConfig
        buildConfigField "int", "MODULE_VERSION_CODE", "1" // 替换为你的模块版本号
        buildConfigField "String", "MODULE_VERSION_NAME", "\"1.0.0\"" // 替换为你的模块版本名,注意字符串要加转义引号

        // 如果需要和宿主app的版本保持一致,可以把版本配置统一存放到根目录的gradle.properties中,两边同步读取
        // 例gradle.properties定义:APP_VERSION_CODE=2、APP_VERSION_NAME=1.1.0
        // 此处改为:
        // buildConfigField "int", "MODULE_VERSION_CODE", project.APP_VERSION_CODE
        // buildConfigField "String", "MODULE_VERSION_NAME", "\"${project.APP_VERSION_NAME}\""
    }
    buildFeatures {
        buildConfig true // 开启BuildConfig生成
    }
}
  1. 同步Gradle后,即可在模块代码中直接调用BuildConfig.MODULE_VERSION_CODE、BuildConfig.MODULE_VERSION_NAME读取对应值。

方案2:通过系统API读取全局应用版本

如果需要读取的是宿主app的全局安装包版本,不需要依赖任何模块的BuildConfig,直接通过PackageManager读取即可:

Kotlin示例

fun Context.getAppVersionCode(): Int {
    return try {
        packageManager.getPackageInfo(packageName, 0).versionCode
    } catch (e: PackageManager.NameNotFoundException) {
        e.printStackTrace()
        -1
    }
}

fun Context.getAppVersionName(): String? {
    return try {
        packageManager.getPackageInfo(packageName, 0).versionName
    } catch (e: PackageManager.NameNotFoundException) {
        e.printStackTrace()
        null
    }
}

Java示例

public class VersionUtils {
    public static int getAppVersionCode(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return -1;
        }
    }

    public static String getAppVersionName(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
}

调用时传入任意Context实例即可拿到和app模块配置完全一致的版本信息。

方案3:通过公共基础模块注入

如果项目存在所有功能模块都依赖的公共Base模块,可以通过注入的方式传递版本信息:

  1. 在Base模块中定义版本存储单例:
object AppVersionHolder {
    var versionCode: Int = -1
    var versionName: String = ""
}
  1. 在app模块的Application初始化时赋值:
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        AppVersionHolder.versionCode = BuildConfig.VERSION_CODE
        AppVersionHolder.versionName = BuildConfig.VERSION_NAME
    }
}
  1. 功能模块直接从Base模块的AppVersionHolder中读取版本信息即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:54:00