【问题标题】:How can I fix "Type org.freedesktop.gstreamer.GStreamer is defined multiple times" error when building an Android APK?如何在构建 Android APK 时修复“类型 org.freedesktop.gstreamer.GStreamer 被定义多次”错误?
【发布时间】:2022-01-22 18:32:24
【问题描述】:

几个月来,我一直致力于将 gstreamer 集成到一个基本的 react-native Android 应用程序中。起点是react-native-gstreamer,但对 gstreamer 管道等进行了一些修改。

我的调试版本(使用yarn android./gradlew assembleDebug 创建)在模拟设备和真实设备上一直可靠运行,但我无法让发布版本/签名的APK ./gradlew assembleRelease 运行。显示错误的构建扫描(使用./gradlew assembleRelease --scan 创建,似乎不包含任何敏感信息?)位于scans.gradle.com。我遇到的错误是

C:\Temp\MyApp\app\intermediates\project_dex_archive\release\out\org\freedesktop\gstreamer\GStreamer.dex: D8: 类型 org.freedesktop.gstreamer.GStreamer 被定义多次:C:\Temp\ MyApp\app\intermediates\project_dex_archive\release\out\org\freedesktop\gstreamer\GStreamer.dex, C:\Temp\MyApp\react-native-gstreamer.transforms\b22258b54d8d354026f3fb18b0251db4\transformed\classes\classes.dex com.android.builder.dexing.DexArchiveMergerException:合并 dex 档案时出错:
通过https://developer.android.com/studio/build/dependencies#duplicate_classes了解如何解决问题。

我是 Android 开发新手(主要是 C++/Python 经验),所以我可能遗漏了一些明显的东西,这似乎是一个常见问题(见下文),但错误中的链接对我和我找到的解决方案没有奏效。

最可能我无法确定的原因是some sort of dependency clash,类似于this issue also,但是我没有很多依赖项,似乎与gstreamer特别相关,我不知道在哪里进一步挖掘以找到冲突。

./gradlew app:dependencies 没有显示任何明显不良的依赖关系。 react-native-gstreamer 对 com.facebook.react:react-native:+ -> 0.63.4 (*) 有依赖关系,并且不会出现在依赖项中的任何其他上下文中(即上述依赖项在输出中出现了几次,但 react-native-gstreamer 不是其他依赖项包并且没有其他依赖项并且没有其他gstreamer出现)

stackoverflow 上其他地方的类似错误以及我未成功测试的解决方案:

  • Delete gradle folder - 故障依旧
  • Enable multiDex in build.gradle - 故障仍然存在(注意 minSdkVersion 设置为 21,所以一些消息表明这不是必需的,但还是尝试了)
  • Similar to this 但我不知道有任何依赖关系
  • ./gradlew clean and ./gradlew assembleRelease - 故障依旧
  • Various solutions
    • 查看AS中给出的路径,应该指向\app\build\intermediates\project_dex_archive\debug\out。转到此路径,删除所有 *.jar 文件,保留最近的一个 - 故障仍然存在(删除的文件在下一次构建时重新创建)
    • 删除构建目录(上面的 C:/Temp/MyApp) - 仍然出现故障
  • Multidex changes - 看起来这对于 minSdkVersion >= 21 来说已经过时了,没有投票,并且有一条评论说它没有解决原始发布者的问题,没有经过测试。

【问题讨论】:

  • C:\Temp\MyApp\app\intermediates\project_dex_archive\release\out\org\freedesktop\gstreamer\GStreamer.dex - project_dex_archive 文件夹通常包含从项目源文件构建的输出工件。您的 app 模块是否可能包含 GStreamer.java 源文件?如果是 - 那么它可能是冲突的根本原因,因为您很可能有来自第三方依赖项 (react-native-gstreamer.transforms\b22258b54d8d354026f3fb18b0251db4\transformed\classes\classes.dex) 的类似工件。
  • 我遵循的链接说明包括将 GStreamer.java 复制到 react-native-gstreamer 文件夹中,所以谢谢@AlexLipov,你说得对,我的项目中有它的副本,会不会有所不同在调试和发布版本之间?我是否应该能够删除跨 GStreamer.java 文件复制的内容?或者引用二进制 Android 构建中的那个?或者删除 Android 构建中提供的那些?
  • 我希望debug 构建在此方面也会失败,也许release 变体执行更严格的验证。我不熟悉这个库,也不熟悉你希望将它集成到你的项目中的方式——但你绝对应该在源文件或依赖项中拥有这个类,而不是两者兼而有之。
  • 找到了副本,我已经关注stackoverflow.com/questions/45044210/… 并手动将 GStreamer.java 复制到顶层,这与 gstreamer Android 构建 makefile 中的自动 sed 版本冲突。 @AlexLipov 如果您想将以上内容作为答案发布,我会将其标记为已接受。

标签: android react-native apk gstreamer dex


【解决方案1】:

错误消息提到了两个包含org.freedesktop.gstreamer.GStreamer 类的 dex 源:

  • C:\Temp\MyApp\app\intermediates\project_dex_archive\release\out\org\freedesktop\gstreamer\GStreamer.dex
  • C:\Temp\MyApp\react-native-gstreamer.transforms\b22258b54d8d354026f3fb18b0251db4\transformed\classes\classes.dex

第一个源的project_dex_archive 文件夹通常包含从项目源文件构建的输出工件。您的应用模块是否可能包含GStreamer.java 源文件?
如果是 - 那么它可能是冲突的根本原因,因为您很可能在第三方依赖项中打包了类似的工件(第二个 dex 源:react-native-gstreamer)。

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 2023-02-16
    • 1970-01-01
    • 2017-05-10
    • 2013-10-28
    • 2015-12-09
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多