同一库的两个不同版本是否可以共存?

T. *_*eau 7 android gradle

我正在开发一个可以播放音频和视频文件的反应本机应用程序。所以我使用两个 javascript 依赖项:react-native-track-playerreact-native-video

就个人而言,它们工作得很好。虽然在一起...

07-23 09:41:24.052 24644 24644 E AndroidRuntime: FATAL EXCEPTION: main
07-23 09:41:24.052 24644 24644 E AndroidRuntime: Process: com.myapp, PID: 24644
07-23 09:41:24.052 24644 24644 E AndroidRuntime: java.lang.NoSuchMethodError: No virtual method setAudioAttributes(Lcom/google/android/exoplayer2/audio/AudioAttributes;)V in class Lcom/google/android/exoplayer2/SimpleExoPlayer; or its super classes (declaration of 'com.google.android.exoplayer2.SimpleExoPlayer' appears in /data/app/~~JZaWLKING3kOoM2Xhy3b8g==/com.myapp-ZiTzxTcb_NCKba7M-tUmIw==/base.apk!classes2.dex)
Run Code Online (Sandbox Code Playgroud)

经过一些研究,它似乎来自版本不匹配,因为它们都依赖于exoplayer.

  • react-native-video
dependencies {
    implementation('com.google.android.exoplayer:exoplayer:2.13.2') {
        exclude group: 'com.android.support'
    }
}
Run Code Online (Sandbox Code Playgroud)
  • react-native-track-player
def safeExtGet(prop, fallback) {
    rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}

dependencies {
    def exoPlayerVersion = safeExtGet("exoPlayerVersion", '2.11.4')
    implementation "com.google.android.exoplayer:exoplayer-core:${exoPlayerVersion}"
}
Run Code Online (Sandbox Code Playgroud)

react-native-track-player似乎又回到了2.11.4:如果我硬编码版本号而不是调用safeExtGet,我可以观察到相同的崩溃。

奇怪的是,构建时没有错误(或警告!)。当使用Android Studio查看react-native-track-playerandroid代码时,setAudioAttributes这是一个有效的方法(至少IDE没有报告错误)。

我的问题是:

  1. 是否可以让同一个库的两个不同版本共存,并且将 Java 代码正确链接到库中使用的版本?(在这种情况下:exoplayer
  2. 如果可能的话,我观察到的行为是否来自这些项目build.gradle文件中的某些设置?
  3. 如果不可能,默认行为是什么?“默默保留高版本”?

提前致谢。

T. *_*eau 7

在与一些人讨论这个问题后,似乎不可能有同一个库的两个不同版本。这似乎是 JVM 的限制,Maven、Gradle 和 Sbt 在遇到这个问题时都有不同的行为。

最让我惊讶的是,Gradle 会在不通知我的情况下用较高版本的依赖项默默地覆盖较低版本的依赖项,这会导致不同的运行时 API,从而导致崩溃。

react-native-track-player exoplayer我通过将依赖版本提升到 来解决这个问题2.13.2,并且只需要对源代码进行一些小的更改。

  • 基本上我有在 1.0 版本需要 `C` 的 dep `A` 和在 1.2 版本需要 `C` 的 dep `B`。因此,我修补了“A”,将其依赖项“C”提升到 1.2(以便它符合“B”的要求)。然后我必须修复由版本号增加引起的错误。之后,两个react-native依赖项都使用相同的Android本机库,一切都很好! (3认同)