為什么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 1versionName "1.0.0"// 手動添加 versionCode 和 versionName 到 BuildConfigbuildConfigField "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 1versionName "1.0.0"// 存儲到 res/valuesresValue "string", "lib_version_name", versionNameresValue "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
。)