从库模块获取版本代码和名称

Reach the version code and name from a library module

我目前正在对我的应用程序进行模块化,因此我将每个功能都放在一个库模块中。在我的一项功能中,我访问了版本代码和名称。但是,尽管我在特定于该模块的 build.gradle 文件中定义了它们

它们不在生成的 BuildConfig 文件中

我无法引用原始 :app 模块的 BuildConfig 文件,因为我不能让我的功能模块依赖于该模块。

是否有其他方法可以从库模块访问此信息?

版本代码和版本名称是应用程序包的属性,库模块不支持它们。

在运行时,您可以传入一个 Context 并在 PackageManager 的帮助下访问此应用程序包元数据。示例:Detect my app's own android:versionCode at run time

虽然上面的答案没问题,但我认为这不是解决问题的最佳方法。一般来说,您希望将版本名称和代码存储在 build.gradle 文件之外的某个地方。我们经常这样做,以便我们可以轻松地从应用程序外部访问它,或者为 CI 系统等自动更新它。

一个非常简单的示例:您可以将它们放在 gradle.properties 文件中,如下所示:

// add to the end of the file:
VERSION_NAME=0.0.1
VERSION_CODE=1

然后您可以通过属性对象在 build.gradle 中简单地访问它们,并将它们添加到 BuildConfig 中(注意:它们只有在成功构建后才可用):

def versionName = properties["VERSION_NAME"]
def versionCode = properties["VERSION_CODE"]
buildTypes.all {
    buildConfigField "String", "VERSION_NAME", "\"$versionName\"" // Escaping quote marks to convert property to String
    buildConfigField "int", "VERSION_CODE", "$versionCode"
}

或者,您可以将它们放在专用的 version.properties 文件中。然后你可以这样做:

def versionProps = loadPropertiesFile(project.file('version.properties'))
buildTypes.all {
    buildConfigField "String", "VERSION_NAME", getPropEscaped("VERSION_NAME", versionProps)
    buildConfigField "int", "VERSION_CODE", getProp("VERSION_CODE", versionProps)
}