【发布时间】: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