java.lang.NoClassDefFoundError: [generisch] bei dalvik.system.NativeStart.main (Native Methode)

8

Einige Benutzer meiner Anwendung haben diese Ausnahme erhalten

%Vor%

Es ist keine häufige Ausnahme wegen der großen Anzahl von Benutzern und nur einige von ihnen haben diese Ausnahme. Ich verwende keine native Bibliothek und alle externen Bibliotheken verwenden keinen nativen Code

Version von Android, wo es passiert ist:

  1. Android 4.0.3 - 4.0.4 (97.7%)
  2. Android 4.0 - 4.0.2 (1.5%)
  3. Android 4.1 (0.8%)

Kann mir jemand bei der Problemumgehung helfen? Kann der Empfänger in AndroidManifest dieses Problem aufrufen?

    
darkchaos 27.02.2014, 15:54
quelle

1 Antwort

7

NoClassDefFoundError mit dem [generic] -Tag wird von der VM aus einem "vorgefertigten" Objekt geworfen. Die Ausnahme hat keinen nützlichen Stack-Trace, erscheint aber im Allgemeinen nicht von selbst.

Hintergrund: Der Mechanismus zum Laden von Klassen erfordert das Auslösen von Ausnahmen, wenn eine Klasse in einem Loader nicht gefunden werden kann. Ladeprogramme müssen auf ihren übergeordneten Loader verschoben werden. Wenn Sie also versuchen, eine Anwendungsklasse zu laden, wird zuerst der Bootstrap-Loader gefragt, der fehlschlägt und eine Ausnahme auslöst. Der App-Loader führt dann seine eigene Suche durch, die wahrscheinlich erfolgreich sein wird.

Dies bedeutet, dass die VM eine Ausnahme zuweist, das Objekt initialisiert und den Stack-Trace ausfüllt ... und dann wegwirft, für jede Klasse, die nicht aus dem Bootstrap-Klassenlader kommt.

Um sinnlose Zuweisungen zu vermeiden, löst der Bootstrap-Loader (der in der VM implementiert ist) ein generisches, zuvor zugewiesenes Ausnahmeobjekt aus. Da das Objekt beim Start der VM vollständig gebildet ist, enthält es keine sinnvollen Stack-Trace-Informationen.

In der Praxis sehen Sie diese nicht, da Anwendungen in der Regel keine Klassen direkt vom Bootstrap-Loader laden. Die Anwendung oder der Systemlader erstellt für Sie eine sinnvolle Ausnahme. Selbst wenn Sie direkt vom Bootstrap-Loader eine Klasse anfordern, sollten Sie dies nur als "Ursache" eines ClassNotFoundException sehen.

Das DexClassLoader wurde geschrieben, um einen Fehlercode anstelle einer Ausnahme zu verwenden, wenn eine Klasse nicht gefunden werden kann, so dass Sie dies über diesen Pfad überhaupt nicht sehen werden.

Wenn NoClassDefFoundError die Ursache einer größeren Ausnahme ist, müssen Sie die äußerste Ausnahme abrufen, da dies die sinnvolle Stack-Ablaufverfolgung hat. Wenn Sie sehen, dass diese selbst erscheinen, dann passiert etwas sehr Seltsames - höchstwahrscheinlich versucht ein bisschen Code, Klassen direkt zu laden und übergibt null anstelle eines Klassenladeobjekts (auf diese Weise verweisen Sie auf den Bootstrap loader).

    
fadden 27.02.2014, 18:57
quelle