2015-02-02 9 views
16

Hallo Freunden auf Stack-ÜberlaufNoClassDefFoundError für .jar Bibliothek zur Laufzeit in Android Studio

ich vor kurzem auf ein Problem stoßen, wenn Fiksu SDK in meinem Android-App zu implementieren. Ein kurzes Intro, Fiksu SDK ist ein Marketing-Tool, um Installation und Ereignisse zu registrieren. Alle Methoden Fiksu Zusammenhang sind in einer .jar-Datei mit dem Namen „ASOTracking.jar“

Das Problem:

Die Bibliothek ist richtig eingestellt, es wird kein Fehler von Gradle gemeldet, wenn Projekt kompiliert und ich kann machen Sie sogar Debug-apk. Es löst jedoch "java.lang.NoClassDefFoundError" zur Laufzeit, wenn es versucht, das SDK zu initialisieren.


Das Protokoll:

01-27 14:06:54.801 31166-31166/com.example.myapp I/dalvikvm﹕ Could not find method com.fiksu.asotracking.FiksuDeviceSettingsManager.getInstance, referenced from method com.fiksu.asotracking.FiksuTrackingManager.getClientId 
01-27 14:06:54.801 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve static method 13738: Lcom/fiksu/asotracking/FiksuDeviceSettingsManager;.getInstance()Lcom/fiksu/asotracking/FiksuDeviceSettingsManager; 
01-27 14:06:54.801 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0000 
01-27 14:06:54.806 31166-31166/com.example.myapp I/dalvikvm﹕ Could not find method com.fiksu.asotracking.FiksuConfigurationManager.getInstance, referenced from method com.fiksu.asotracking.FiksuTrackingManager.initialize 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve static method 13733: Lcom/fiksu/asotracking/FiksuConfigurationManager;.getInstance()Lcom/fiksu/asotracking/FiksuConfigurationManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x000f 
01-27 14:06:54.806 31166-31166/com.example.myapp I/dalvikvm﹕ Could not find method com.fiksu.asotracking.FiksuDeviceSettingsManager.getInstance, referenced from method com.fiksu.asotracking.FiksuTrackingManager.isAppTrackingEnabled 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve static method 13738: Lcom/fiksu/asotracking/FiksuDeviceSettingsManager;.getInstance()Lcom/fiksu/asotracking/FiksuDeviceSettingsManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0000 
01-27 14:06:54.806 31166-31166/com.example.myapp I/dalvikvm﹕ Could not find method com.fiksu.asotracking.FiksuDeviceSettingsManager.getInstance, referenced from method com.fiksu.asotracking.FiksuTrackingManager.setAppTrackingEnabled 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve static method 13738: Lcom/fiksu/asotracking/FiksuDeviceSettingsManager;.getInstance()Lcom/fiksu/asotracking/FiksuDeviceSettingsManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0010 
01-27 14:06:54.806 31166-31166/com.example.myapp I/dalvikvm﹕ Could not find method com.fiksu.asotracking.FiksuDeviceSettingsManager.getInstance, referenced from method com.fiksu.asotracking.FiksuTrackingManager.setClientId 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve static method 13738: Lcom/fiksu/asotracking/FiksuDeviceSettingsManager;.getInstance()Lcom/fiksu/asotracking/FiksuDeviceSettingsManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0010 
01-27 14:06:54.806 31166-31166/com.example.myapp I/dalvikvm﹕ Could not find method com.fiksu.asotracking.FiksuConfigurationManager.getInstance, referenced from method com.fiksu.asotracking.FiksuTrackingManager.setDebugModeEnabled 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve static method 13733: Lcom/fiksu/asotracking/FiksuConfigurationManager;.getInstance()Lcom/fiksu/asotracking/FiksuConfigurationManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0001 
01-27 14:06:54.806 31166-31166/com.example.myapp E/dalvikvm﹕ Could not find class 'com.fiksu.asotracking.CustomEventTracker', referenced from method com.fiksu.asotracking.FiksuTrackingManager.uploadCustomEvent 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve new-instance 2112 (Lcom/fiksu/asotracking/CustomEventTracker;) in Lcom/fiksu/asotracking/FiksuTrackingManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x000f 
01-27 14:06:54.806 31166-31166/com.example.myapp E/dalvikvm﹕ Could not find class 'com.fiksu.asotracking.PurchaseEventTracker', referenced from method com.fiksu.asotracking.FiksuTrackingManager.uploadPurchase 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve new-instance 2125 (Lcom/fiksu/asotracking/PurchaseEventTracker;) in Lcom/fiksu/asotracking/FiksuTrackingManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0022 
01-27 14:06:54.806 31166-31166/com.example.myapp E/dalvikvm﹕ Could not find class 'com.fiksu.asotracking.PurchaseEventTracker', referenced from method com.fiksu.asotracking.FiksuTrackingManager.uploadPurchaseEvent 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve new-instance 2125 (Lcom/fiksu/asotracking/PurchaseEventTracker;) in Lcom/fiksu/asotracking/FiksuTrackingManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0014 
01-27 14:06:54.806 31166-31166/com.example.myapp E/dalvikvm﹕ Could not find class 'com.fiksu.asotracking.RegistrationEventTracker', referenced from method com.fiksu.asotracking.FiksuTrackingManager.uploadRegistration 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve new-instance 2126 (Lcom/fiksu/asotracking/RegistrationEventTracker;) in Lcom/fiksu/asotracking/FiksuTrackingManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x001e 
01-27 14:06:54.806 31166-31166/com.example.myapp E/dalvikvm﹕ Could not find class 'com.fiksu.asotracking.RegistrationEventTracker', referenced from method com.fiksu.asotracking.FiksuTrackingManager.uploadRegistrationEvent 
01-27 14:06:54.806 31166-31166/com.example.myapp W/dalvikvm﹕ VFY: unable to resolve new-instance 2126 (Lcom/fiksu/asotracking/RegistrationEventTracker;) in Lcom/fiksu/asotracking/FiksuTrackingManager; 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0010 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x35ce at 0x2b in Lcom/fiksu/asotracking/FiksuTrackingManager;.initialize 
01-27 14:06:54.806 31166-31166/com.example.myapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x35c5 at 0x2e in Lcom/fiksu/asotracking/FiksuTrackingManager;.initialize 
01-27 14:06:54.811 31166-31166/com.example.myapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x359b at 0x15 in Lcom/fiksu/asotracking/FiksuTrackingManager;.uploadCustomEvent 
01-27 14:06:54.811 31166-31166/com.example.myapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x35cf at 0x30 in Lcom/fiksu/asotracking/FiksuTrackingManager;.uploadPurchase 
01-27 14:06:54.811 31166-31166/com.example.myapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x35cf at 0x23 in Lcom/fiksu/asotracking/FiksuTrackingManager;.uploadPurchaseEvent 
01-27 14:06:54.811 31166-31166/com.example.myapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x35d1 at 0x26 in Lcom/fiksu/asotracking/FiksuTrackingManager;.uploadRegistration 
01-27 14:06:54.811 31166-31166/com.example.myapp I/dalvikvm﹕ DexOpt: unable to optimize static field ref 0x1507 at 0x16 in Lcom/fiksu/asotracking/FiksuTrackingManager;.uploadRegistrationEvent 
01-27 14:06:54.811 31166-31166/com.example.myapp D/dalvikvm﹕ DexOpt: unable to opt direct call 0x35d1 at 0x19 in Lcom/fiksu/asotracking/FiksuTrackingManager;.uploadRegistrationEvent 
01-27 14:06:54.811 31166-31166/com.example.myapp D/AndroidRuntime﹕ Shutting down VM 
01-27 14:06:54.811 31166-31166/com.example.myapp W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41ecb700) 
01-27 14:06:54.821 31166-31166/com.example.myapp E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NoClassDefFoundError: com.fiksu.asotracking.FiksuConfigurationManager 
      at com.fiksu.asotracking.FiksuTrackingManager.initialize(FiksuTrackingManager.java:83) 
      at com.example.userinterface.MyApplication.onCreate(MyApplication.java:56) 
      at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4684) 
      at android.app.ActivityThread.access$1400(ActivityThread.java:159) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5419) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
      at dalvik.system.NativeStart.main(Native Method) 

Meine lokale Umgebung:

  1. Projekt auf Android Studio entwickelt
  2. Ich verwende Mac OS X 10. 8.5 Mountain Lion
  3. compileSdkVersion 21, buildToolsVersion "21.1.2", gradleVersion = '2.2.1', com.android.tools.build:gradle:1.0.0
  4. Dies ist ein Multi-Modul-Projekt. Das Anwendungsmodul ruft das Bibliothekmodul "userInterface" auf, und dieses SDK befindet sich in diesem Bibliothekmodul.

Was ich habe versucht:

  1. Ich mache sicher, dass das SDK (jar-Datei) richtig eingestellt ist und es gibt keine Kompilierung-Fehler von Gradle berichtet
  2. ich machen sicher, dass es keinen Syntaxfehler an den Stellen gibt, an denen SDK-Methoden aufgerufen werden
  3. Ich überprüfte die Abhängigkeit des Moduls, das dieses SDK aufruft, um sicherzustellen, dass es kein Abhängigkeitsproblem gibt. Ich gehe so weit, dass ich sogar den gesamten Abhängigkeitsbaum abschneide (ich weiß, dass es unnötig ist).
  4. Ich versuchte, das "build" Verzeichnis aller Module zu löschen und neu erstellen, das gesamte Projekt
  5. ich den "Invalidate Cache/Restart" Betrieb in Android Studio
  6. ausgeführt I durchgeführt über Terminal "./gradlew reinigen" Befehl an Verzeichnis des Stammverzeichnisses und des Anwendungsmoduls.
  7. Ich konsultierte die folgenden Links in STO ohne Erfolg:

Android Studio - Importing external Library/Jar

Android Studio: Add jar as library?

Android studio Gradle Could not find method compile()

Getting "Caused by: java.lang.VerifyError:"

Unable to find classes in Android library file

NoClassDefFoundError with libraries in Android Studio


Abschließende Gedanken:

Ich brauche ernsthafte Hilfe, weil ich alles versucht habe, den ich kenne. Dieses SDK funktionierte einwandfrei, bevor ich dieses Projekt von Eclipse migrierte. Jetzt wird eine merkwürdige Ausnahme ausgelöst, wenn es in Android Studio ausgeführt wird.

Es gibt eine letzte Sache, die irgendwie verdächtig ist --- die Classpath-Datei in Android Studio (die ***. Imi-Datei), ich ordne die Classpath-Einträge in ihm und es funktioniert immer noch nicht.

Vielen Dank Jungs für Ihre Hilfe!

Antwort

22

Neue Erkenntnisse

My GS4 (Android 4.3) können diese App nicht ausgeführt, aber HTC One M8 (Android 5.0.1) kann es

Root Cause

65K Methoden laufen Limit Siehe dieses Dokument: https://developer.android.com/tools/building/multidex.html Grundsätzlich gibt es ein Methodenreferenzlimit und die einzige Lösung ist die Verwendung der Multidex-Konfiguration. Allerdings gibt es Implementierung für Plattformen vor 5.0 und nach 5,0

Lösung

Die Lösung wird in beide beschrieben: https://developer.android.com/tools/building/multidex.html https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html für mein Projekt, da es ältere Version von Android unterstützt, gehe ich mit der Lösung "multidex support library".

  1. die Build-Tool Version aller Bibliotheksmodule Set und App-Modul auf die neuesten 21.1.2
  2. Für Modul, die Application-Klasse hat, Kompilierung ‚com.android.support:multidex:1.0.0‘ hinzufügen, Abhängigkeit
  3. Siehe diesen Link, um Ihre Anwendungsklasse zu ändern.https://developer.android.com/reference/android/support/multidex/MultiDexApplication.html
  4. Zur gleichen gradle Skript unter Android -> DefaultConfig Block, fügen Sie "multiDexEnabled true"
  5. Wenn Ihr System "Java Heap Size" Fehler gibt, in dem gradle Skript App-Modul, fügen Sie die folgenden

dexOptions { 
 
    incremental true 
 
    javaMaxHeapSize "4g" 
 
}

+1

m gleiches Problem .... mit Ihrer Lösung meiner app auf genymotion laufen, aber nicht auf reales Gerät .... Jede Lösung für diesen plz ?? –

+0

Hi Entschuldigung für die späte Antwort, können Sie die Build.Gradle-Datei Ihres Anwendungsmoduls veröffentlichen? Dies wird mir helfen, die Ursache einzugrenzen. –

+3

Problem gelöst .... durch die Erweiterung MyApplication erweitern MultiDexApplication .... Danke –

Verwandte Themen