为什么AAR库模块的 BuildConfig
没有 versionCode
和 versionName
?
- aar库模块的
BuildConfig
默认不包含版本信息- 应用模块(
com.android.application
)会自动生成versionCode
和versionName
到BuildConfig
。 - 但库模块(
com.android.library
)默认不会生成这些字段,因为它的版本信息通常由发布到 Maven 时的pom.xml
或gradle
依赖管理决定。
- 应用模块(
- 库模块的版本号通常由
publishing
或maven-publish
插件管理- 当你发布 AAR 到 Maven 仓库时,版本信息由
groupId:artifactId:version
决定(如com.example:mylib:1.0.0
),而不是BuildConfig
。
- 当你发布 AAR 到 Maven 仓库时,版本信息由
如何让库模块(AAR)的 BuildConfig
包含 versionCode
和 versionName
?
在库模块的 build.gradle
中,手动定义 buildConfigField
:
android {
defaultConfig {
versionCode 1
versionName "1.0.0"
// 手动添加 versionCode 和 versionName 到 BuildConfig
buildConfigField "int", "VERSION_CODE", "$versionCode"
buildConfigField "String", "VERSION_NAME", "$versionName"}
}
编译后,BuildConfig
会包含:
public final class BuildConfig {
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0.0";
}
代码中调用:
val versionName = BuildConfig.VERSION_NAME // "1.0.0"
val versionCode = BuildConfig.VERSION_CODE // 1
方法 2:使用 resValue
在 resources
中存储版本(可选)
如果不想修改 BuildConfig
,也可以把版本信息存到 res/values
:
android {
defaultConfig {
versionCode 1
versionName "1.0.0"
// 存储到 res/values
resValue "string", "lib_version_name", versionName
resValue "integer", "lib_version_code", "$versionCode"}
}
代码中调用:
val versionName = context.resources.getString(R.string.lib_version_name)
val versionCode = context.resources.getInteger(R.integer.lib_version_code)
方法 3:通过 PackageManager
获取(适用于已打包的 AAR)
如果 AAR 已经打包进 APK,可以通过 PackageManager
获取(但需要知道库的 packageName
):
val packageInfo = context.packageManager.getPackageInfo("com.your.library.package", 0)
val versionName = packageInfo.versionName
val versionCode = packageInfo.versionCode
(注意:这种方式需要 AAR 的 AndroidManifest.xml
正确声明 versionCode
和 versionName
。)