Unity Android:无法构建Firebase和Mapbox项目

时间:2020-06-14 16:05:12

标签: android firebase unity3d build mapbox

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

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

(完整版发布于here pastebin,因为它太长了)

版本号:
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,然后从那里进行构建等等。
遗憾的是,这些都不对我有用。

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

提前谢谢!

PS:如果我尝试按照错误消息中的建议禁用R8,则会收到有关与“重复的jar条目[com / google / d / d $ 5.class]”相关的读取错误的java.io.IOException。 ,但总的来说,无论我尝试哪种解决方法,通常都会收到与其他方法不同的错误消息。

1 个答案:

答案 0 :(得分:0)

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

您的构建中似乎包含Google gson library的两个副本。检查mapbox-unity-sdk_v2.1.1,我发现unity软件包中包含文件gson-2.8.5.jar。由于该构建显然包含gson作为副作用,因此删除该文件可能会很好。但是我怀疑其中包含的支持库可能会引起问题。

鉴于此,我建议采取三种补救措施:

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

我建议reading this article来全面了解正在发生的事情,但是您要做的是在Editor文件夹中创建一个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的工具,如果您在External Dependency Manager中启用它,它将自动执行此操作:

screenshot of Jetifier option

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

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

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

我希望所有的帮助!

-帕特里克