Facebook-sdk-for-unity: Android - 依赖项不兼容导致启动时崩溃

创建于 2019-08-03  ·  25评论  ·  资料来源: facebook/facebook-sdk-for-unity

你好,

我们将 Facebook SDK 与 Firebase SDK 一起使用,在更新到 Unity 2019.2 后,我被迫将 Firebase SDK 更新到版本 6.2.2(由于 Unity 编辑器中的错误),现在由于问题,它似乎与 Facebook SDK 不兼容在解决依赖关系。 这是我在解决问题时从 Play Services Resolver 收到的警告:

发现了一些相互冲突的依赖关系。
修改了以下依赖版本:
com.android.support:appcompat-v7:25.3.1 --> androidx.appcompat:appcompat:1.0.0
com.android.support:cardview-v7:25.3.1 --> androidx.cardview:cardview:1.0.0
com.android.support:customtabs:25.3.1 --> androidx.browser:browser:1.0.0
com.android.support:support-v4:25.3.1 --> androidx。 遗留:遗留支持-v4 :1.0.0

它会导致在 Android 上启动时崩溃。

我没有深入研究它,但我想将 Play Services Resolver 更新到一些较新的版本并在此处修复依赖项: https :

也可以在这里查看更多信息:
https://github.com/googlesamples/unity-jar-resolver/blob/master/CHANGELOG.md#version -12118---jun-18-2019
可能有助于解决它。 顺便说一句,Firebase 现在使用 Play Services Resolver 1.2.122。 我想是时候为 Facebook SDK 更新它了。

这是一个非常严重的问题,因为我们现在无法在 Unity 2019.2 上将官方 Facebook SDK 与 Firebase 一起使用。 我们也无法降级 Unity 版本,因为它修复了另一个重大错误。 正因为如此,我们有点卡住了,直到这个问题得到解决,我们被迫在我们的游戏中禁用 Facebook 功能。

这可能与此处的评论之一中描述的问题相同: https :

最有用的评论

@KylinChang - 是的,我的问题现在已经解决。 这要归功于@michael-looply 制作的 fork 但是他的更改需要添加到主存储库中,否则这只是一个临时修复。 谢谢。

所有25条评论

@andnoonesthere ,我遇到了同样的问题,昨天花了一些时间制作了一个支持 2019.2.0f1 和 Firebase 的 fork。 我已经在 Android 和 iOS 上测试了两个 SDK 的功能,看起来一切都按预期运行。 作为警告,在使用 2019.2.0f1 之前的 Unity 版本通过提供的脚本构建 SDK 时,我的 fork 中的更改应该使构建过程向后不兼容。

请注意,如果您想在本地构建 SDK,我更新了 repo 以要求配置环境变量,以便可以使用基于 Hub 的 Unity 实例( .csproj文件和 shell 脚本在此 repo 中具有硬编码路径,使得不可能在不使用 Unity 的确切路径的机器上构建)。

如果您对我所做的更改感兴趣,相关差异位于此处。 包位于此处

如果您在启动和运行时遇到任何问题,请告诉我。


与此特定问题相关的附加说明,因为我这次将其发布在正确的 repo 中:我删除了您在评论中引用的解析器脚本,并将依赖项迁移到Dependencies.xml文件中并更新了解析器版本并修复了依赖项我遇到的问题; 希望也能为您解决这些问题。

你好迈克尔,

我刚刚测试了您的更改(仅限 Android),它对我也很有效。 做得好! :)
我也同意将依赖项移动到 Dependencies.xml 文件也是一件重要的事情。

查看您的更改,我认为开发人员应该在 SDK 中包含对依赖项和解决方案路径的修复,以便我们自己进行修改在将来会更容易。

再次感谢您的工作。 我想在他们发布官方补丁之前我会使用你的版本:)

经过一些额外的测试,我发现虽然在设备上一切正常,但我在编辑器中收到此警告:

FB.Init() 已经被调用。 您只需要调用一次,并且只需要调用一次。

但是我 100% 确定它只被调用一次,我之前对 FB.IsInitialized 进行了额外的检查。 这也可能与您的修改无关,而是最近 FB SDK 中的一些错误。 如果您也遇到这种情况,请告诉我。

乐于帮助! 随着新的 SDK 版本的发布,我会尽量保持我的 fork 更新,直到 2019.2.0f1 正式添加。

关于您的最后一条评论:我没有在编辑器或设备上看到该警告。 我怀疑您看到的是因为FB.Init()不会立即将FB.IsInitializedtrue ; SDK 必须在设置FB.IsInitialized之前完成初始化 - 这不能保证立即完成。

编辑器专门等待调用 DLL 加载委托,可以在此处查看

除了FB.IsInitialized是否为true之外,我建议跟踪 Facebook 初始化是否正在进行中。 一个快速的方法来跟踪这是一个bool _isInitializing;时设置到true在时间FB.Init ,并设置为falseInitDelegate传递给FB.Init方法。 这样你可以中止额外的FB.Init调用,如果一个正在进行,除了它已经完成。

好的,所以错误是因为我在播放模式下加载场景的方式。 进入播放模式时,我卸载所有加载的场景,然后加载我的自定义场景集。 这就是它被加载两次的地方,它已经在开始时卸载的那个基本场景中加载了。 无论如何,感谢您的提示:)

嘿@KylinChang。 为什么这被关闭了? 你已经解决了你这边的依赖问题,它会被包含在下一个版本中吗? 我没有看到任何有关它的信息。

@andnoonesthere ,我以为你已经解决了这些问题。 我重新打开问题并提交任务来解决问题。

@KylinChang - 是的,我的问题现在已经解决。 这要归功于@michael-looply 制作的 fork 但是他的更改需要添加到主存储库中,否则这只是一个临时修复。 谢谢。

你好@andnoonesthere和@michael-looply。 您使用的是哪个版本的 Firebase 和 Play Services Resolver,或者更简单的问题,您如何使用您的解决方法?

我们遇到了完全相同的问题,我们正在尝试将 Firebase 6.2.2 与它的播放服务解析器和@michael-looply 提供的解决方法与它的播放服务解析器一起使用(我们已经尝试了两种解析器和一个没有使用 gradle),但我们无法编译应用程序。 我不确定我们是否做错了什么,或者是否有其他插件会导致与 Facebook 相同的问题(例如 AdMob、IronSource 等)

@Wolar - 我正在使用 Firebase 6.2.2 和 Resolver 1.2.124.0。 我的项目中只保留一个PlayServicesResolver目录。 您看到什么编译错误? 目前我没有在 Unity Ads 之外使用任何广告中介 SDK,所以我不能说这些是否会导致更多问题。

这是一个 gradle 构建错误,类似于:

“com.android.support.support-v4-27.0.2.aar' 使用 Jetifier。原因。给定的工件包含一个字符串文字,其中包含无法安全重写的包引用 'android.support.v4'。使用反射的库,例如因为注释处理器需要手动更新以添加对 androidx..() 的支持"

Facebook SDK 正在使用这个库,我认为其他一些库也在使用它。 我已经尝试在 PlayServicesResolver 中启用和禁用 Jetifier 但没有任何效果。 我们还使用自定义 gradle 模板,因此 PlayServicesResolver 不会将库复制到 Plugins 文件夹中,而是将它们添加到该 gradle 模板中,但我猜这不应该发挥任何作用。

@Wolar您的资产目录中是否存在该 AAR? 另一个 SDK 可能没有使用解析器,只是直接将 AAR 导入到项目中。

或者,您的mainTemplate.gradle中的依赖项块是否包含对支持库的两个引用? 不能列出同一个库的两个显式版本; 如果您的依赖项块中有一行,例如来自 Resolver 内部的implementation 'com.android.support:support-v4:25.3.1' // Assets/FacebookSDK/Plugins/Editor/Dependencies.xml:7

// Android Resolver Dependencies Start
... dependencies
// Android Resolver Dependencies End

部分并在该部分之外有另一个像implementation 'com.android.support:support-v4:27.0.2' ,那么您将无法构建。 例如, ironSource Unity 插件建议使用支持库参考手动修改mainTemplate.gradle文件。 您可能需要为解析器可以处理的铁源创建Dependencies.xml ,而不是直接修改您的mainTemplate.gradle

@michael-looply 我很确定我们在插件文件夹中也有一个 AAR,但我想我试图删除它,因为我预期它可能会导致问题,但我认为它没有帮助。 我会检查其他 sdk,如 IronSource,谢谢:)

我能够解决它,这是更多的问题。 真正帮助我的是将项目导出为 Android Studio 项目并在那里进行调试。 基本上,这些库也与 AdMob 和一些我们不再使用的 Fabric 剩余库相冲突。 所以我升级了 AdMob,删除了那个 aar,在依赖文件中硬改变了几个版本的库,它似乎可以作为 androidx 库使用 jetifier。 感谢@michael-looply 的帮助

@Wolar很高兴听到它的工作! 乐于帮助 :)

那么@KylinChang我们

@KylinChang

2020 年 2 月仍然是一个问题。

  • Unity 2019.3.1f1(无法降级)
  • 最新的 facebook-unity-sdk-7.18.1
  • 由于最新的 AdMob,强制使用 androidx 和 jetifier(无法降级)
  • Android 解析器仍会在 ProjectSettings/AndroidResolverDependencies.xml 以及 gradle 模板中生成提到的过时依赖项。 没有其他提及项目范围内的过时库
  • 删除 Facebook SDK 后,过时的库消失了。

是否有升级 FacebookSDK 依赖项的计划?

2020 年 3 月仍然是一个问题

  • 统一 2019.3.4f1
  • Facebook SDK 7.18.1
  • IronSource SDK 6.15.0.1

不能用我认为这个星球上的任何其他 sdk 来构建。 包括 Firebase 和 IronSource。 这是荒谬的,因为它直接适用于广告优化,与金钱相关的事情。

2020 年 3 月仍然是一个问题

  • 统一 2019.3.4f1
  • Facebook SDK 7.18.1
  • IronSource SDK 6.15.0.1

不能用我认为这个星球上的任何其他 sdk 来构建。 包括 Firebase 和 IronSource。 这是荒谬的,因为它直接适用于广告优化,与金钱相关的事情。

Looply 的解决方案已不再适用。 我调查了这个问题。 Facebook 需要更新他们的 SDK 才能使用 AndroidX。 但与此同时,Google 提供了 External Dependency Manager 工具,该工具应该对 Facebook SDK(和其他旧库)进行 Jetify,以便它可以与 AndroidX 一起使用。 不幸的是,由于某种原因,EDM 不能与 Facebook SDK 一起使用。 但是:Android Studio 附带的 Jetifier 确实有效! 只需从 Unity 导出您的项目,在 Android Studio 中打开,将这些行添加到 gradle.properties:
android.useAndroidX=真
android.enableJetifier=真

构建并运行,一切都应该进行了。 但是:Facebook 需要立即修复此问题。 (或者 Google 需要修复他们的 Jetifier。)然而,我认识的每一家公司,无论大小,都发布了他们库的 AndroidX 版本。 令我震惊的是 Facebook,一家大公司,还没有解决这个问题,因为它给开发人员带来了很多痛苦。

@lexscite

对于仍然坚持这一点的任何人:
1) 您可以使用 Android Studio 修复它(正如我上面提到的。)
2)onesignal 还有一个解决方案: https: //documentation.onesignal.com/docs/troubleshooting-unity#section -android-x-compatibility 可以让您直接从 Unity 运行构建(通过添加 settingsTemplate.gradle 文件。 )

Unity 中的 Jetifier/AndroidX 支持似乎有些失败。

这个错误:
https://github.com/googlesamples/unity-jar-resolver/issues/360是我向 unity-jar-resolver 团队提交的文件,但我们会看看这是否是修复它的合适团队。

Jetifier 不再需要 Android Studio Exports 才能在 Unity 中工作。

使用最新的 2019.3 官方版本(我的是 2019.3.12f1 atm)您可以在主 Gradle 模板之上使用自定义 Gradle 属性模板,并添加:
android.useAndroidX=true
android.enableJetifier=true
到新生成的 gradleTemplate.properties 文件。

我一直在导出到 Android Studio 以使用我的发布者想要的所有 SDK 进行构建,并从那时起解决了 Android 构建错误的痛苦,作为初级开发人员,我认为我遇到了所有问题,但现在我终于可以在 Unity 中进行构建了。 除了在 Android Studio 中,Jetifier 无法与 Facebook SDK 正常工作,因此如果您使用了足够多的 AndroidX 迁移插件,那么在没有一些hacky 更改的情况下很难在 Unity 中构建。

我通常还必须更改 Plugins/Android/AndroidManifest.xml 以在应用程序标记中包含此内容:
tools:replace="android:appComponentFactory" android:appComponentFactory="leavemealone"
清单标签中还有xmlns:tools="http://schemas.android.com/tools"

是的,它是一个随机字符串,因为我不确定它的目的是什么,但它可以工作并修复我的清单合并构建错误,哦,好吧。

我现在可以使用 Ironsource(许多适配器)、Facebook SDK、GameAnalytics、Adjust、Firebase 等进行构建。 基本上只需获取最新的 Unity Jar Resolver,检查设置,删除自动解析,删除构建时的解析,设置补丁主模板并使用 jetifier 为 true,强制解析,添加您想要的任何额外依赖项/存储库,执行 gradleproperties 技巧,在 Unity 中构建,完成.

我在 Facebook Unity SDK v8.1.1 上遇到了这个问题。 每次我想集成 Facebook Unity SDK 时,我都必须做@mohamad-al-amaary 所做的所有事情吗?

@nguyentrong101094
在 2019.4 LTS Unity 版本中我没有遇到任何问题,您需要做的就是我最初回复中的这部分:
android.useAndroidX=真
android.enableJetifier=真

此外,我认为新的 EDM 有一个选项“Patch gradleTemplate.properties”,它甚至应该为您做到这一点。 我现在至少在每个项目中启用自定义主清单、自定义主 Gradle 模板、自定义 Gradle 属性模板,并设置这两个属性,并确保使用 EDM 解决(https://github.com/googlesamples/unity-jar-构建前的 resolver/blob/master/external-dependency-manager-latest.unitypackage)。

@Subtle-Tea 我试过了。 构建时我仍然收到此错误

AndroidManifest.xml:38: AAPT: error: unexpected element <queries> found in <manifest>.

我正在使用 Unity 2019.4.17

此页面是否有帮助?
0 / 5 - 0 等级