Google.JarResolver.ResolutionException: 无法解析 com.google.firebase:firebase-analytics-unity:1.0.0()

Google.JarResolver.ResolutionException: Cannot resolve com.google.firebase:firebase-analytics-unity:1.0.0()

在我的 Unity 项目中,我使用了一些资产,如 FacebookSDK、OneSignal 等。每当我导入 OneSignal 时,都会显示此错误。

Google.JarResolver.ResolutionException: Cannot resolve com.google.firebase:firebase-analytics-unity:1.0.0()

我试过很多东西,这些是我记得的:

当我导入 Firebase 时,错误变成了另一个错误,即与 Firebase 相关的名为 CommandInvokationFailure 的构建错误。

我花了好几天时间修好,还是不行。如果您需要更多信息,请告诉我。

编辑:@nika 感谢您的回复。我尝试了 API 23-24-25 和构建工具从 23 到 25 的所有组合。但是,我还不能修复 'CommandInvokationFailure'。我认为分享错误的完整日志会更好:

CommandInvokationFailure: Unable to convert classes into dex format.
/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/bin/java -Xmx2048M -Dcom.android.sdkmanager.toolsdir="/Users/emre/Desktop/AndroidSDK/tools" -Dfile.encoding=UTF8 -jar "/Applications/Unity/PlaybackEngines/AndroidPlayer/Tools/sdktools.jar" -

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzah;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzcn;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/BuildConfig;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoIcsImpl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoJellyBeanMr2;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoStubImpl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/animation/AnimatorCompatHelper;

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Translation has been interrupted
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:608)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at SDKMain.main(SDKMain.java:129)
Caused by: java.lang.InterruptedException: Too many errors
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:600)
    ... 9 more
]

编辑 2:@jkasten 感谢您的回复。我可以修复 Android 支持库 v4 错误,但是,由于解析器,第二个错误并不容易。

没有重复的播放服务文件。这一次,我即兴解决了这个问题:通过更改导入设置从 android 构建中删除 play-services-ads-9.0.1(如果删除其他广告文件,CommandInvokationFailure 错误继续。)。我真的不知道这是解决问题的正确方法,但它以某种方式起作用。但是当我尝试在我的 phone:

上玩 运行 游戏时,它又导致了另一个错误
FATAL EXCEPTION: main
E/AndroidRuntime(18680): java.lang.NoSuchMethodError: No static method zzb(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; in class Lcom/google/android/gms/common/internal/zzaa; or its super classes (declaration of 'com.google.android.gms.common.internal.zzaa' appears in /data/app/***/base.apk)
E/AndroidRuntime(18680):    at com.google.firebase.provider.FirebaseInitProvider.zza(Unknown Source)
E/AndroidRuntime(18680):    at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
E/AndroidRuntime(18680):    at android.app.ActivityThread.installProvider(ActivityThread.java:5159)
E/AndroidRuntime(18680):    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4754)
E/AndroidRuntime(18680):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4694)
E/AndroidRuntime(18680):    at android.app.ActivityThread.access00(ActivityThread.java:150)
E/AndroidRuntime(18680):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
E/AndroidRuntime(18680):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(18680):    at android.os.Looper.loop(Looper.java:148)
E/AndroidRuntime(18680):    at android.app.ActivityThread.main(ActivityThread.java:5423)
E/AndroidRuntime(18680):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(18680):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
E/AndroidRuntime(18680):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

来自您日志中的以下两行:

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzcn;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/BuildConfig;

这意味着您的项目中有 2 个或更多 Google Play services libraryAndroid Support Library v4 的副本。


修复 Android 支持库 v4 错误 (support/v4)

为了在同一个 Unity 项目中同时使用 OneSignal 和 Facebook SDK,您需要删除 OneSignal troubleshooting guide.

中记录的以下重复库
FacebookSDK/plugins/android/libs/support-v4-23.4.0.aar
FacebookSDK/plugins/android/libs/support-annotations-23.4.0.aar

这将修复 already added: Landroid/support/v4 错误,除非它们是此库以及您项目中的第三个插件。


修复 Google 播放服务库错误 (gms)

我建议删除 Unity 项目中的重复 play-services-[library]-[version].aar 文件。会有不同的 [libraries] 但是所有 play-services-*.aar 文件应该只有一个版本。这应该可以修复 already added: Lcom/google/android/gms 错误。

如果您遇到困难,请使用带有版本号的完整插件列表更新您的问题。同时列出项目中的所有 .aar.jar 文件。另外,您可以创建一个新项目并一次添加一个插件,直到出现错误以指出导致问题的插件组合。

这个问题提到了几个不同的错误。所有这些最终都与 Unity 项目中的原生 Android 库(.jar 或 .aar)有关。

我会尽力解决您提到的所有问题:

无法解析(库名)

Google.JarResolver.ResolutionException: Cannot resolve com.google.firebase:firebase-analytics-unity:1.0.0()

很多 Android 插件使用 Play Services Resolver - 这是帮助程序代码,它试图通过自动解析所需的 Google 播放服务库(位于 Android SDK 文件夹).

它的工作原理是将所需的依赖项设置为 class 的静态实例,然后尝试解析所需的库。 有时,解析器的操作可能会失败,因为它的持久化数据可能会变成 "out of sync"。

在这种情况下,可能发生的情况是静态对象仍在尝试解析 "firebase-analytics-unity" 库,但此文件夹已从项目中删除,因此无法查找。

已添加Lxxx/xxx/xxx

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzah; Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/internal/zzcn; Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/BuildConfig; Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat; Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoIcsImpl; Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoJellyBeanMr2; Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoStubImpl; Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl; Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/animation/AnimatorCompatHelper;

正如@jkasten 已经回答的那样,您的项目包含多个插件,这些插件包含相同的已编译 Java classes。可以通过 class 名称找到关于哪个库被复制的提示(尽管并不总是有用)。在这种情况下,您可以看到它与 com.google.android.gms(google 播放服务)和 Android 支持库(android.support.v4.xxx)有关。

没有静态方法zzb

FATAL EXCEPTION: main E/AndroidRuntime(18680): java.lang.NoSuchMethodError: No static method zzb(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; in class Lcom/google/android/gms/common/internal/zzaa; or its super classes (declaration of 'com.google.android.gms.common.internal.zzaa' appears in /data/app/***/base.apk) E/AndroidRuntime(18680): at com.google.firebase.provider.FirebaseInitProvider.zza(Unknown Source) E/AndroidRuntime(18680): at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source) E/AndroidRuntime(18680): at android.app.ActivityThread.installProvider(ActivityThread.java:5159) E/AndroidRuntime(18680): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4754) E/AndroidRuntime(18680): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4694) E/AndroidRuntime(18680): at android.app.ActivityThread.access00(ActivityThread.java:150) E/AndroidRuntime(18680): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) E/AndroidRuntime(18680): at android.os.Handler.dispatchMessage(Handler.java:102) E/AndroidRuntime(18680): at android.os.Looper.loop(Looper.java:148) E/AndroidRuntime(18680): at android.app.ActivityThread.main(ActivityThread.java:5423) E/AndroidRuntime(18680): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime(18680): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

这是一个更微妙和棘手的问题。该游戏内置于 .apk 中,但由于未找到 class 而在 运行 时崩溃。 从方法名称 (zzb) 判断 - 这是 Google 播放服务中的内部 "obfuscated" 方法。如果您将 google 播放服务的多个版本混合在一起(例如 - 9.8.0 版的 Firebase 与不同版本的 Google 播放服务),就会发生这种情况。

保持所有这些版本彼此一致至关重要,有时使用自动执行此操作的解析器可能会有点棘手。

最后的注释:

我提供 a professional service 帮助解决此类问题。如果您以后 运行 遇到类似问题,请随时与我联系。