0

Meine App funktionierte.Fehler bei der Aktualisierung von Firebase-SKDs: java.lang.NoClassDefFoundError:

Ich habe alle meine Spieldienste auf 9.0.0 aktualisiert, das Plugin 'com.google.gms.google-services' und den Klassenpfad 'com.google.gms:google-services:3.0.0' angewendet.

Jetzt ist mein App abstürzt und wirft diese Fehler:

/UncaughtException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/fasterxml/jackson/databind/ObjectMapper; 
    at com.firebase.client.core.view.QueryParams.<clinit>(QueryParams.java:36) 
    at com.firebase.client.Firebase.<init>(Firebase.java:172) 
    at com.firebase.client.Firebase.<init>(Firebase.java:177) 
    at com.firebase.client.Firebase.<init>(Firebase.java:155) 
    at com.defaultPackage.Application.addListener(Application.java:324) 
    at com.defaultPackage.Application.onCreate(Application.java:84) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1012) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4553) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.fasterxml.jackson.databind.ObjectMapper" on path: DexPathList[[zip file "/data/app/com.defaultPackage-2/base.apk"],nativeLibraryDirectories=[/data/app/com.defaultPackage-2/lib/arm, /vendor/lib, /system/lib]] 

ich this Frage sah aber die Antwort sofern nicht den Fehler für mich lösen hat.

Weiß jemand, was es verursacht?

+1

Welche Version des Firebase Android SDK verwenden Sie? Können Sie alle Ihre Abhängigkeiten teilen? Firebase SDK 9.0.0 hängt nicht mehr von Jackson ab. Wenn Sie also das neue SDK richtig verwenden, sollten Sie keine Referenzen auf Jackson-Klassen sehen. –

+1

Das klingt wie der Beginn einer guten Antwort @hatboysam :-) –

+0

@FrankvanPuffelen Am Ende fand ich heraus, dass dieser Fehler wegen der Art und Weise geworfen wurde, wie ich verschiedene ProduktFlavours in meinem App-Level build.gradle eingerichtet hatte. Ich habe detailliert beschrieben, was ich getan habe, um zu verhindern, dass der Fehler in meiner Antwort angezeigt wird. –

Antwort

0

Update:

Meine ursprüngliche Antwort das Problem lösen kann, sondern auf Upgrade auf das neue Firebase SDK I war erforderlich, um das Plugin 'com.google.gms.google-services' zu installieren, aber wie ich bereits compiling 'com.google.android.gms:play-services:version' verursachte dies eine Art von Konflikt, und durch Entfernen der kompilierten Play-Services-Bibliothek aus meiner App build.gradle das Problem wurde behoben und meine ProduktFlavours nicht mehr benötigt, entfernt werden

Ursprüngliche Antwort:

Verlassen des Firebase SDK-Code 100% unmodifizierte Willen in einigen Fällen lassen die alte Firebase SDK-Funktion, wie es verwendet wird, wenn Sie auf die neue Firebase SDK aktualisieren. Aber in meinem Fall, obwohl ich meinen Code zu 100% unverändert ließ, wurde java.lang.NoClassDefFoundError geworfen.

Das Problem wurde durch die Anwendung der Linie 'apply plugin: 'com.google.gms.google-services' meine App-Ebene build.gradle verursacht, die Leitung 'classpath 'com.google.gms:google-services:3.0.0' meines Projektebene build.gradle und die Google-Dienste-Datei zum Projekt und zu aktualisieren Play-Dienste 9.0.0 to google

Das Update führte dazu, dass java.lang.NoClassDefFoundError sowohl von der Facebook Rebound-Bibliothek als auch vom alten Firebase SDK ausgelöst wurde.

Mein Projekt ist ein multidex Projekt und in meiner App-Ebene build.gradle ich die Zeilen hatte:

productFlavors { 
     // Define separate dev and prod product flavors. 
     dev { 
      // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin 
      // to pre-dex each module and produce an APK that can be tested on 
      // Android Lollipop without time consuming dex merging processes. 
      minSdkVersion 21 
     } 
     prod { 
      // The actual minSdkVersion for the application. 
      minSdkVersion 14 
     } 
    } 

Durch Kommentierung oder Entfernen dieser Linien die java.lang.NoClassDefFoundError wurde nicht mehr vom alten Firebase SDK oder der Facebook Rebound-Bibliothek ausgelöst.

3

Der Fehler erwähnt den Jackson ObjectMapper. Das neue Firebase Database Android SDK hängt nicht von Jackson ab, daher bedeutet Ihr Fehler, dass Sie eine Version von 'com.firebase:firebase-client-android' verwenden.

Sie sollten diese Bibliothek aus Ihrem build.gradle entfernen. Die Bibliothek, die Sie verwenden möchten, lautet: com.google.firebase:firebase-database:9.0.0

The migration guide erläutert die Codeänderungen, die für diese Änderung erforderlich sind. Die wichtigste Änderung ist die folgende:

VOR

Firebase ref = new Firebase("<URL>"); 

NACH

DatabaseReference ref = FirebaseDatabase.getInstance.getReference(); 
+0

Vielen Dank für Ihre Antwort. Das Beenden von Aufrufen des alten Firebase-Objekts verhindert das Auftreten dieses Fehlers. Ist es jedoch nicht möglich, die neuen Firebase-SDKs gleichzeitig zu installieren und den alten Firebase SDK-Code weiterhin auszuführen? Im Migrationsleitfaden [https://firebase.google.com/support/guides/firebase-android#import_your_project_to_the_new_firebase_console_numbered] heißt es im Abschnitt "Installieren des neuen Firebase SDK" nicht, dass der alte Firebase-Code nicht funktioniert Nach der Installation des neuen SDK –

+0

Es ist möglich, dass Ihr alter Code ausgeführt wird, jedoch würde ich eine Teilmigration vermeiden. Wenn Sie eine der neuen '9.0.0'-Bibliotheken verwenden, würde ich alle Komponenten gleichzeitig aktualisieren, um Fehler zu vermeiden. Ihr alter Code, wenn Sie ihn zu 100% unverändert lassen, sollte weiter laufen. –

+0

Vielen Dank für Ihre Antwort, aber in meinem Fall den Code 100% unverändert lassen ließ den alten Firebase-Code nicht ausführen, ohne den java.lang.NoClassDefFoundError zu werfen: Fehler. Ich habe jedoch herausgefunden, warum dieser Fehler ausgelöst wurde, und ich habe die Antwort unten angegeben –