首页 > 解决方案 > 我可以保留依赖项使用的旧版本的库吗?

问题描述

我有一个 Android 项目,其中 Glide v4 是它的依赖项之一。

这个项目有另一个依赖,我们称之为它dependency A,它依赖于 Glide v3。
我不知道这是否重要,但dependency A只能作为 aar 包含在内。

所以这是我的一部分build.gradle

implementation(name: 'dependency_a', ext: 'aar')
implementation ("com.github.bumptech.glide:glide:4.7.1") {
    exclude group: "com.android.support"
}
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

该应用程序可以编译;但是当dependency A运行使用 Glide v3 的代码时:

Glide.with(context).load(imageUrl).asBitmap().into(new SimpleTarget<Bitmap>() {...}

该应用程序因以下消息而崩溃:

java.lang.NoSuchMethodError: No virtual method load(Ljava/lang/String;)Lcom/bumptech/glide/DrawableTypeRequest; in class Lcom/bumptech/glide/RequestManager; or its super classes (declaration of 'com.bumptech.glide.RequestManager' appears in /data/app/{my.package.name}}-LItMzBkBqXw3lyYYdKp-SA==/base.apk:classes15.dex)

我正在寻找一种保留 Glide v3 的方法dependency A,但仍将 Glide v4 用于我的应用程序和其他依赖项。

甚至可能吗?

为什么我不简单地为我的应用程序使用 Glide v3

这是因为另一个dependency B需要我使用 Glide v4。

标签: androidgradleandroid-glide

解决方案


Gradle 的依赖解决方案是在有多个备选方案可用或需要时选择一个版本。

最终,给定 ClassLoader 中的给定类全名只能有一个类,因此可能性是:

  • 更改包名称。例如 Spongy Castle 从 移动org.bouncycastle.*org.spongycastle.*以避免与平台的版本冲突。

  • 使用多个类加载器。我相信 Android 支持自定义类加载器,但这可能会涉及相当多的工作,并带有一些微妙的陷阱。

我认为不幸的是,在您的情况下,这都不是一个实际的解决方案。


推荐阅读