如何在Android Library模块中获取version code与version name?
问题原因说明
Android Library模块默认不会将build.gradle中定义的versionCode、versionName自动生成到BuildConfig类中,只有Application类型的模块才会默认生成这两个字段,这是AGP的默认行为,不是配置错误。
以下是3种可行的实现方案:
方案1:手动在Library模块生成自定义BuildConfig字段
如果需要读取的是当前Library模块自身的版本信息,直接手动配置BuildConfig字段即可:
- 首先开启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生成 } }
- 同步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模块,可以通过注入的方式传递版本信息:
- 在Base模块中定义版本存储单例:
object AppVersionHolder { var versionCode: Int = -1 var versionName: String = "" }
- 在app模块的Application初始化时赋值:
class MyApplication : Application() { override fun onCreate() { super.onCreate() AppVersionHolder.versionCode = BuildConfig.VERSION_CODE AppVersionHolder.versionName = BuildConfig.VERSION_NAME } }
- 功能模块直接从Base模块的
AppVersionHolder中读取版本信息即可。
内容的提问来源于stack exchange,提问作者Walid Baroudi
相关产品推荐
相关产品推荐

