使用与app相同的gradle依赖关系的Android库(.aar) - 但是不同的版本会导致NoClassDefFoundError

时间:2016-04-14 17:00:53

标签: java android android-gradle

我创建了一个打包为 .aar 文件的Android库。

我的库内部使用了Squares Retrofit库的v1.8.0。

我的图书馆的最终用户也在使用Retrofit,但他们使用的是2.0.1。

当他们尝试运行他们的app时会出现问题,当它到达我的库中调用v2中不再存在的Retrofit函数的行时会抛出java.lang.NoClassDefFoundError

dependencies {
    compile 'com.mylibrary.sdk:mylibrary:1.0.1@aar'
    compile 'com.squareup.retrofit:retrofit:1.8.0'
    ...
    compile 'com.squareup.retrofit:retrofit:2.0.1'
}

我想知道是否有一种标准的处理方法吗?

想到的简单选择是:

  1. 我们将Retrofit版本升级为2
  2. 最终用户将其Retrofit版本降级为1
  3. 这两种选择都是短期的。另外,例如,如果我们升级到Retrofit 2并且新的最终用户出现使用Retrofit 1,我们将面临同样的问题,但反过来。

    已经做过一些研究,创建一个完整的 .aar 构建或使用着色,可能是解决方案。如果有人能够阐明在这种情况下如何使用它们将会非常感激。

1 个答案:

答案 0 :(得分:0)

问题可能在其他地方。这并不是因为缺少某些方法,因为Retrofit的新版本(2.X.X)可以与旧版本(2.0.0)并行工作。因此,如果将两个版本都正确导入到项目中,您应该能够同时使用RetrofitRetrofit2。这是可能的,因为新版本的库具有不同的包(retrofit2.Retrofit而不是retrofit.Retrofit)。

您确定您的图书馆包含Retrofit 1.8.X吗?也许它只是使用了库中的方法,但1.8.X版本未附带aar版本?这实际上解释了很多。

你能做的是:

  • 要求使用您图书馆的人包含Retrofit的两个版本,除了您的图书馆。

compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.retrofit2:retrofit:2.0.1'

  • 确保Retrofit1.X.X)的正确版本包含在您的资源库aar中。