是否可以在运行时获取依赖版本,包括从库本身获取依赖版本?

and*_*per 5 android dependency-management android-gradle-plugin

背景

假设我制作了一个名为“MySdk”的 Android 库,并将其发布到 Jitpack/Maven 上。

SDK 的用户只需添加以下依赖项即可使用它:

implementation 'com.github.my-sdk:MySdk:1.0.1'
Run Code Online (Sandbox Code Playgroud)

我想要得到的是其中的“1.0.1”部分,无论我是从 Android 库本身(对于发送到使用哪个版本的 SDK 服务器很有用),还是从应用程序执行此操作使用它(对于报告特定问题很有用,包括通过 Crashlytics)。

问题

我找不到任何反射或 gradle 任务来实现它。

我尝试过的

搜索一下,如果我确实在 Android 库(用作依赖项)上工作,我发现我可以通过代码自己管理版本。

有人说我可以使用库的包名称的 BuildConfig,但这意味着如果我在发布依赖项之前忘记更新代码,它将使用错误的值。使用此方法的示例:

plugins {
...
}
final def sdkVersion = "1.0.22"

android {
    ...
    buildTypes {
        release {
            ...
            buildConfigField "String", "SDK_VERSION", "\"" + sdkVersion + "\""
        }
       debug {
            buildConfigField "String", "SDK_VERSION", "\"" + sdkVersion + "-unreleased\""
        }
    }
Run Code Online (Sandbox Code Playgroud)

BuildConfig.SDK_VERSION用法只是检查(构建后)的值。

另一种可能的解决方案可能是来自 Android 库内的 gradle 任务,每当您构建使用该库的应用程序时,都会强制启动该任务。但是,我没找到怎么做(在这里找到了一些东西)

问题

是否可以从依赖项的 Android 库(当然还有使用它的应用程序)查询依赖项版本,以便我可以在运行时使用它?

自动的东西,不需要我在发布之前更新它?

也许使用库中定义的 Gradle 任务,并在构建使用该库的应用程序时强制使用?

Pav*_*sha 1

你的问题的简单答案是“是”——你可以做到。但如果你想要一个简单的解决方案来做到这一点,那么答案就会变成“否”——没有简单的解决方案。

这些库位于包的类路径中,因此在运行时访问其信息的唯一方法是在编译时记录所需的信息并在运行时将其公开给您的应用程序。

有两种主要的“正确”方法,您在问题中已经描述了它们,但我会详细说明一下。

  1. 最正确和相对简单的方法是通过 gradle 将所有这些变量公开为 BuildConfig 或 String res 值,几乎如此处所述。您可以尝试使用 local-prefs(或辅助 gradle 文件)来通用化该方法来存储版本并在需要的地方使用它们。更多信息请点击此处此处此处
  2. 第二种正确但更复杂的方法是编写一个 gradle 插件或至少编写一些任务,用于在编译时收集所需的值,并为您的应用程序提供一个接口(通常通过您的应用程序资产或资源)以在编译时访问它们运行。谷歌图书馆已经实现了一个非常相似的东西,Google Play services Plugins所以这将是一个很好的起点。

所有其他可能的实施方式都是所描述的两种实施方式或其组合的变体。