【问题标题】:Unity Android: Can't build Firebase and Mapbox ProjectUnity Android:无法构建 Firebase 和 Mapbox 项目
【发布时间】:2020-06-18 00:28:11
【问题描述】:

我目前正在尝试为 Android, 构建一个 Unity 项目,该项目利用 MapboxFirebase、Unity 的内置 AR Foundation 以及来自 Asset Store 的一些较小的包,这些包不能作为源的问题。 我在成功添加 Firebase 之前构建了项目,但现在出现以下错误:

D8: Program type already present: com.google.gson.FieldNamingPolicy$5

(完整版发布herepastebin,因为它很长)

版本号:
Unity 2019.3.0f6
Firebase Unity SDK 6.14.0
Mapbox Unity SDK 2.1.1

据我所知,问题是基于 Mapbox 和 Firebase 之间存在依赖问题。但是,我不知道如何修复它们。
我尝试了所有可以找到的可行解决方案,包括自定义级模板、Gradle 设置、尝试在旧版 Unity (2018.3.14f1) 上进行内部构建、将项目导出到 Android Studio,然后从那里构建等等。
可悲的是,这些对我都不起作用。

我还有其他方法可以解决这个问题吗?

提前谢谢你!

P.S.:如果我尝试按照错误消息中的建议禁用 R8,我会收到一个 java.io.IOException,该异常是关于与“重复的 jar 条目 [com/google/d/d$5.class]”相关的读取错误,但总的来说,无论我尝试什么修复方法,我最终都会收到与其他方法不同的错误消息。

【问题讨论】:

    标签: android firebase unity3d build mapbox


    【解决方案1】:

    我对可能发生的情况有所了解,但没有立即测试此解决方案的方法。

    您的构建中似乎包含两个 Google gson library 副本。检查mapbox-unity-sdk_v2.1.1,我看到有一个文件gson-2.8.5.jar包含在unity包中。由于构建显然包含 gson 作为副作用,因此删除此文件可能会很好。但我怀疑也包含在内的支持库可能会导致问题。

    鉴于此,我会建议三种补救途径:

    1) 您可能希望使用 Unity 的外部依赖管理器为您解析这些文件。这包含在 Firebase SDK 中(并且是一个完全开源的项目,因此您可能希望 MapBox 将来使​​用它)。

    我会推荐reading this article 以完全了解正在发生的事情,但您要做的是在编辑器文件夹中创建一个MapboxDependencies.xml 文件(例如:Assets/Mapbox/Editor/MapboxDependencies.xml)并包含Mapbox/Core/Plugins/Android 下的所有依赖项:

    <dependencies>
        <androidPackages>
            <androidPackage spec="com.google.code.gson:gson:2.8.6"/>
        </androidPackages>
    </dependencies>
    

    完成后删除相关的 jar/aar 文件。

    请注意,您必须为这些追踪 maven 存储库,否则我会为您包含一个完整的 xml 文件。

    现在可能导致您出现问题的库都是支持库。看起来 Mapbox 可能仍在使用 Android Jetpack 之前的旧支持库。有mappings here,所以我会先为您检查一下他们的 Dependencies.xml 条目:

    <dependencies>
        <androidPackages>
            <androidPackage spec="com.google.code.gson:gson:2.8.6"/>
            <androidPackage spec="androidx.appcompat:appcompat:1.1.0"/>
            <androidPackage spec="androidx.legacy:legacy-support-core-ui:1.1.0"/>
            <androidPackage spec="androidx.legacy:legacy-support-core-utils:1.1.0"/>
            <androidPackage spec="androidx.media:media:1.1.0"/>
            <androidPackage spec="androidx.legacy:legacy-support-v4:1.1.0"/>
            <androidPackage spec="androidx.vectordrawable:vectordrawable:1.1.0"/>
        </androidPackages>
    </dependencies>
    

    您通常会遇到的另一个问题是,在正常情况下,您必须重新编译所有依赖旧支持库的库才能引用新的 androidx 库。 Jetpack 确实附带了一个名为 Jetifier 的工具,如果您在外部依赖管理器中启用它,它应该会自动执行此操作:

    尽管您可能会在 Unity 2019.3 及更高版本的某些配置上遇到this issue(问题线程中的解决方法)。

    2) 或者,您可以添加mainTemplate.gradle 来实现相同的目标。我建议使用 ExternalDependencyManager,但是通过删除 aar/jar 库并将它们作为依赖项添加到 mainTemplate 中,您将有效地实现相同的结果。

    3) 如果您在没有 mainTemplate.gradle 的情况下解决依赖关系 - 所有 Firebase 的 aar/jar 文件都将添加到 Assets/Plugins/Android/Firebase。如果您删除了与 Mapbox 库的所有冲突,您可能会遇到相同的问题。这对我来说感觉有点危险,并且支持库可能更难使用(例如,您必须自己追踪 androidx 库) - 但如果依赖管理器是新的,则可能会删除一些移动部分给你。

    希望对大家有所帮助!

    --帕特里克

    【讨论】:

    • 感谢您的回答!我现在实际上设法构建了这个项目!但是,在运行它时出现另一个错误(此时我正在尝试加载 Mapbox):pastebin.com/yfrQzdWS
    • 如果我有 Mapbox 设置,我可能能够找到您丢失的文件。看起来您缺少提供 com.mapbox.android.telemetry.MapboxTelemetry 的任何 jar/aar 您可以参考此文档:docs.oracle.com/javase/tutorial/deployment/jar/view.html,并在 Mac/Linux 上运行 jar tf &lt;jar-file-name-here&gt; | fgrep MapboxTelemetry 之类的命令在 Windows (PowerShell) 上运行 jar tf &lt;jar-file-name-here&gt; | Select-String -Pattern "MapboxTelemetry" 以帮助您找到它.
    • 看来我根本没有 MapboxTelemetry。唯一包含对它的引用的文件是 TelemetryAndroid.cs,在该文件中调用使用参数"com.mapbox.android.telemetry.MapboxTelemetry" 创建新的 AndroidJavaObject。遥测功能似乎只与 Mapbox 的一种反馈相关。是否可以在某处将其关闭,从而解决此错误,同时仍允许地图工作?还是我应该尝试重新导入 Mapbox?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2019-08-13
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多