Android Activity ClassNotFoundException – alles versucht
Lesezeit: 11 Minuten
Matthäus Rathbone
Ich habe gerade eine App in eine Framework-Bibliothek und eine Anwendung umgestaltet, aber wenn ich jetzt versuche, die App im Emulator zu starten, erhalte ich den folgenden Fehler-Stack-Trace:
06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main
06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.os.Looper.loop(Looper.java:123)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.reflect.Method.invokeNative(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.reflect.Method.invoke(Method.java:521)
06-02 18:22:35.529: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 18:22:35.529: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 18:22:35.529: E/AndroidRuntime(586): at dalvik.system.NativeStart.main(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
06-02 18:22:35.529: E/AndroidRuntime(586): ... 11 more
Normalerweise bedeutet dies, dass die Manifestdatei in irgendeiner Weise falsch ist, aber ich habe alles, was mir einfällt, doppelt überprüft.
Hier ist meine Aktivitätsklasse:
package com.matthewrathbone.eastersays;
import android.os.Bundle;
import com.rathboma.simonsays.Assets.Season;
import com.rathboma.simonsays.SeasonPicker;
import com.rathboma.simonsays.SimonSaysActivity;
public class EasterSimonSaysActivity extends SimonSaysActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public SeasonPicker getSeasonPicker() {
return new SeasonPicker(){
@Override
public Season getSeason() {
// TODO Auto-generated method stub
return Season.EASTER;
}
};
}
}
Wie Sie sehen können, ist es im Manifest korrekt aufgeführt:
Ich habe keine Ahnung, wie ich das beheben kann, und wäre für jede Hilfe dankbar. Ich habe viele ähnliche Fragen zu SO gescannt, ohne dieses spezielle Verhalten zu sehen.
Mehr Info:
Ich habe das generierte APK überprüft und die Klasse hat einen Eintrag in der Datei “classes.dex”.
Ich habe versucht, das Projekt in Eclipse zu bereinigen/zu erstellen
Ich habe versucht, ein völlig neues Geräte-Image zu verwenden, das noch keine Kopie des APK enthält
Ich habe das Bibliotheksprojekt in ein normales Java geändert und dann wieder in ein Android-Projekt geändert, kein Unterschied
Das Hinzufügen der abstrakten SimonSaysActivity zum Manifest macht keinen Unterschied.
Ich habe versucht, jede Abhängigkeit zu einem Android-Bibliotheksprojekt zu machen, und die Synchronisierung der Android-Version, die sie benötigen, hat nicht geholfen
Lösung gefunden (siehe unten). An alle, die eine Antwort / einen Kommentar gepostet haben: Ihr rockt alle, danke, dass ihr mir geholfen habt, die Probleme zu lösen!
Befindet sich Ihre Aktivität in der Bibliothek oder in der Anwendung?
– Jeschurun
2. Juni 2012 um 22:35 Uhr
Das steht in der Bewerbung. Es erweitert eine Basisaktivität im Bibliotheksprojekt.
– Matthew Rathbone
2. Juni 2012 um 22:36 Uhr
Baust du mit Ant oder mit ADT? Es scheint, dass Dex-Dateien keine Bibliotheksklassen enthalten.
– Tomasz Gawel
2. Juni 2012 um 23:05 Uhr
Der Fehler impliziert, dass Ihr Aktivitätsort com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity ist – eindeutig nicht richtig. Versuchen Sie, dem Projektpaket eine Paketebene hinzuzufügen, die nicht in der Bibliothek vorhanden ist, z. B. …eastersays.myapp.EasterSimonSaysActivity, und geben Sie com.matthewrathbone.eastersays.myapp als Paket im Manifest an. Fügen Sie der Bibliothek jedoch nicht die Ebene „myapp“ hinzu, um den Projektpfad im Manifest vom Pfad des Bibliotheksframeworks zu unterscheiden.
Ich habe einige Zeit damit verbracht, mit meinem eigenen Projekt zu spielen, und ich kann Ihr Problem replizieren und beim Versuch, mein Hauptprojekt auszuführen, genau denselben Ausnahme-Stack-Trace erhalten, also denke ich, dass dies die Ursache sein könnte:
Genau wie ich dachte, geht es darum, wie Sie auf Ihr Android-Bibliotheksprojekt im Android-Hauptprojekt verweisen, eine einfache Eclipse-Konfigurationseinstellung.
Der falsche Weg:
Hauptprojekt rechtsklicken, auswählen Properties -> Java Build Path -> Projects -> Add..., fügt dies das Android-Bibliotheksprojekt als Abhängigkeitsprojekt im Build-Pfad des Android-Hauptprojekts hinzu, dies funktioniert nicht. Wenn alle erforderlichen Android-bezogenen Ressourcen im Hauptprojekt definiert sind, erhalten Sie zur Kompilierzeit keinen Fehler, aber wenn Sie die Anwendung ausführen, erhalten Sie die in der Frage beschriebene Ausnahme.
Der richtige Weg:
Hauptprojekt rechtsklicken, auswählen Properties -> Android, fügen Sie hier im Abschnitt Bibliothek Ihr Android-Bibliotheksprojekt hinzu. Sehen Sie sich den offiziellen Entwicklerleitfaden an Referenzieren eines Bibliotheksprojekts. Dies sollte alle Ihre Probleme beheben. Beachten Sie auch, dass Sie den relativen Pfad verwenden müssen, um auf das eigentliche Android-Bibliotheksprojekt zu verweisen, wie in der angegeben Bibliotheksprojekt – Überlegungen zur Entwicklung.
Hoffe das hilft.
Du mein Freund bist ein Genie. Das Interessante daran ist, dass ich immer eine Bibliothek „falsch“ eingebunden habe, und es hat funktioniert. Als ich also in zwei Bibliotheken umgestaltete, dachte ich, ich hätte es anders gemacht. Sie haben mir gerade Stunden über Stunden Arbeit erspart.
– Matthew Rathbone
10. Juni 2012 um 0:10 Uhr
Das Lustige ist, es hat vorher funktioniert, ich denke, ein Upgrade meiner SDK-Tools hat das Verhalten geändert. Es war sehr nicht offensichtlich.
– Matthew Rathbone
10. Juni 2012 um 0:23 Uhr
Ja, die Aktualisierung der SDK-Tools auf >ADT 17 führt zu diesem Fehler aufgrund einer Änderung in der Art und Weise, wie die aktuelle ADT-Version mit Bibliotheken umgeht. Kasse: iqadd.com/item/noclassdeffounderror-adt-fix
– Nick
12. Juni 2012 um 12:57 Uhr
Die Aktualisierung auf ADT 22 führte zu einem ähnlichen Problem: stackoverflow.com/questions/16596969/…
– Nils
24. Mai 2013 um 7:43 Uhr
Kann mir bitte jemand sagen wo ich die finde Properties? Ich kann es anscheinend nirgends finden.
– lebhaft
6. April 2017 um 8:56 Uhr
Ich habe den Code getestet, den Sie gegeben haben, und es funktioniert gut. Versuchen Sie, “erweitert SimonSaysActivity” einfach in “erweitert Aktivität” zu ändern, und überzeugen Sie sich selbst, dass es funktioniert.
Der Grund, warum es nicht funktioniert, ist entweder, dass SimonSaysActivity Activity nicht erweitert (was ich nicht glaube, dass Sie diesen Fehler gemacht haben) oder die Reihenfolge des Erstellungspfads falsch ist.
Um zur Reihenfolge des Erstellungspfads zu gelangen, gehen Sie zu:
project->properties->Java build path->order and export .
Meine Grundreihenfolge ist: Projekt src, Projekt gen, Android 4.0.3, Android-Abhängigkeiten.
Dieses Problem tritt normalerweise auf, wenn Sie Bibliotheken verwenden.
Du hast also recht, wenn ich Activity direkt erweitere funktioniert es. Meine Build-Reihenfolge stimmt mit Ihrer überein, daher kann ich keine Möglichkeit finden, sie auf diese Weise zu beheben. Irgendwelche anderen Ideen?
– Matthew Rathbone
3. Juni 2012 um 14:04 Uhr
das ist wirklich seltsam. versuchen Sie, die sdk&adt zu aktualisieren. Bitte teilen Sie mir auch mit, ob Ihre App mehrere Bibliotheksprojekte (oder JAR-Dateien oder beides) verwendet. Wenn ja, versuchen Sie, ein wenig mit der Reihenfolge des Erstellungspfads zu spielen (ich würde versuchen, die Bibliotheken vorher zu platzieren). außerdem habe ich noch eine frage: hast du eine klasse mit dem namen “aktivität” erstellt und diese vielleicht statt der von android erweitert?
– Android-Entwickler
3. Juni 2012 um 14:08 Uhr
Es gibt 2 Bibliotheksprojekte, das zweite (Engine) ist sowohl von simonSays als auch vom Android-Projekt abhängig. Ich habe jede Kombination von Build-Reihenfolge ausprobiert und das Engine-Projekt von SimonSays exportiert. Antwort auf Ihre Frage: Ich habe nirgendwo eine Klasse namens Aktivität.
– Matthew Rathbone
3. Juni 2012 um 15:07 Uhr
der Motor ist das Herzstück. andere Projekte sollten es verwenden und nicht das Gegenteil. Nur das Projekt, das ein Android-Projekt ist (also kein Bibliotheksprojekt), sollte das Manifest haben, das die Deklaration aller Aktivitäten, Dienste usw. enthält. Das Manifest für Android-Bibliotheksprojekte hat (derzeit) nicht viele Zwecke (Weitere Informationen finden Sie hier: stackoverflow.com/a/10445630/878126 )
– Android-Entwickler
3. Juni 2012 um 15:18 Uhr
Sie müssen haben . Es ist nur so, dass die Manifestdatei sehr kurz sein kann und fast nichts enthält. Überprüfen Sie auch die Datei project.properties (in jedem der Projekte), dass ihr Ziel-SDK 15 ist, da dies derzeit die neueste Version ist. Wenn Sie möchten, können Sie mir eine PN senden, und ich werde die Projekte reparieren.
– Android-Entwickler
3. Juni 2012 um 16:05 Uhr
Alex Lockwood
Ich habe gerade eine App in eine Framework-Bibliothek und eine Anwendung umgestaltet.
Ich bin mir nicht ganz sicher, was Sie hier sagen wollen, aber die Tatsache, dass Sie hier das Wort „umgestaltet“ verwendet haben, lässt mich glauben, dass Sie das Konzept eines Bibliotheksprojekts missverstehen.
Welche Bibliotheksprojekte sind:
Ein Bibliotheksprojekt ist ein Entwicklungsprojekt, das gemeinsam genutzten Quellcode und Ressourcen enthält. Andere Android-Projekte können auf das Bibliotheksprojekt verweisen und seine kompilierten Quellen zur Kompilierzeit in ihre APK-Dateien aufnehmen.
Welche Bibliotheksprojekte sind nicht:
Ein Bibliotheksprojekt unterscheidet sich von einem Standard-Android-Projekt darin, dass Sie es nicht direkt zu einem einzigen kompilieren können .apk Datei und führen Sie sie auf einem Android-Gerät aus. Sie können ein Android-Projekt nicht als Bibliotheksprojekt verwenden und dann ein anderes Android-Projekt haben erweitern das Bibliotheksprojekt. So geht das nicht.
Das heißt, ich würde die Struktur Ihres Bibliotheksprojekts untersuchen und sicherstellen, dass Sie dies getan haben richtig einstellen. Es ist in Ordnung, Ihre Bibliothek zum Speichern von gemeinsam genutztem Code/Ressourcen zu verwenden, aber wenn Ihre Bibliothek versucht, sich so zu verhalten, als wäre sie eine separate .apk innerhalb des Bibliotheksprojekts selbst, dann haben Sie wahrscheinlich etwas falsch gemacht. ich glaube a ClassNotFoundException würde geworfen, wenn dies der Fall wäre. Um das Problem zu beheben, würde ich das Bibliotheksprojekt einfach von Grund auf neu erstellen, anstatt zu versuchen, das Android-Projekt in ein Bibliotheksprojekt zu konvertieren. Das verhindert, dass Sie auf winzige, lästige Fehler stoßen.
Fühlen Sie sich frei, mehr Code zu posten, wenn Sie immer noch Probleme haben. Sie sollten auch etwas mehr auf die Struktur (und den Zweck) Ihres Bibliotheksprojekts eingehen … warum Sie sich entschieden haben, eines zu verwenden, wie Sie es erstellt haben usw.
Ja, ich habe die einzelnen Projekte absolut korrekt behandelt, es war die Art und Weise, wie ich auf die Bibliotheksprojekte verwiesen habe, die das Problem tatsächlich verursacht hat. Danke aber für die tolle Hilfe!
– Matthew Rathbone
10. Juni 2012 um 0:24 Uhr
np… es war einen Versuch wert, haha
– Alex Lockwood
10. Juni 2012 um 0:25 Uhr
Für Eclipse Kepler (Mac): Control-click project -> Android Tools -> add support library
Ich hatte dieses Problem bei einem Projekt, an dem ich arbeitete, obwohl mein Fall anders war. Wenn jemand da draußen immer noch keine Lösung für sein Problem finden kann, versuchen Sie Folgendes:
Darin finden Sie eine Liste mit allen Quellordnern, die kompiliert und jedes Mal in die generierte APK eingefügt werden müssen, um Ihr Projekt zu erstellen (und /gen). Typisch:
>MyProject/gen
>MyProject/src
Sie sollten sicher sein, dass in jedem Ihrer Quellordner (exclude /genalso nur /src in diesem Fall) den Artikel Output folder verweist auf den Standardausgabeordner, der ist MyProject/bin/classes. Tun Sie dies, indem Sie Ausgabeordner auswählen und auf der rechten Schaltflächengruppe auf Entfernen klicken (dadurch wird auf den Standardordner verwiesen).
Wenn Sie den Unterpunkt Ausgabeordner nicht sehen können, aktivieren Sie direkt unter der Liste “Ausgabeordner für Quellordner zulassen”.
Corona
Wenn Sie alle Hinweise befolgt haben (die privaten Bibliotheken überprüft usw.) und den Fehler immer noch haben. Überprüfen Sie Ihr Manifest auf diese Codezeile im Anwendungs-Tag
android:hasCode="false"
Entferne es und sei glücklich. (war ich endlich) 🙂
classNotFoundException in Java ist eine Unterklasse von java.lang.Exception und kommt, wenn Java Virtual Machine versucht, eine bestimmte Klasse zu laden und die angeforderte Klasse nicht im Klassenpfad findet.
Versuchen Sie, zu gehen Project -> Properties -> Java Build Path -> Order & Export Und Bestätigen Sie die privaten Android-Bibliotheken werden für Ihr Projekt und für alle anderen Bibliotheksprojekte, die Sie in Ihrer Anwendung verwenden, überprüft.
Umgang mit der ClassNotFoundException
Stellen Sie sicher, dass der Name der angeforderten Klasse korrekt ist und dass die entsprechende .jar Datei existiert in Ihrer Klassenpfad. Wenn nicht, müssen Sie es explizit zum Klassenpfad Ihrer Anwendung hinzufügen.
Falls die angegebene JAR-Datei in Ihrem Klassenpfad vorhanden ist, wird der Klassenpfad Ihrer Anwendung überschrieben und Sie müssen den genauen Klassenpfad finden, der von Ihrer Anwendung verwendet wird.
Falls die Ausnahme durch eine Klasse eines Drittanbieters verursacht wird, müssen Sie die Klasse identifizieren, die die Ausnahme auslöst, und dann die fehlende Klasse hinzufügen .Krug Dateien in Ihrer Klassenpfad.
8940200cookie-checkAndroid Activity ClassNotFoundException – alles versuchtyes
Befindet sich Ihre Aktivität in der Bibliothek oder in der Anwendung?
– Jeschurun
2. Juni 2012 um 22:35 Uhr
Das steht in der Bewerbung. Es erweitert eine Basisaktivität im Bibliotheksprojekt.
– Matthew Rathbone
2. Juni 2012 um 22:36 Uhr
Baust du mit Ant oder mit ADT? Es scheint, dass Dex-Dateien keine Bibliotheksklassen enthalten.
– Tomasz Gawel
2. Juni 2012 um 23:05 Uhr
Der Fehler impliziert, dass Ihr Aktivitätsort com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity ist – eindeutig nicht richtig. Versuchen Sie, dem Projektpaket eine Paketebene hinzuzufügen, die nicht in der Bibliothek vorhanden ist, z. B. …eastersays.myapp.EasterSimonSaysActivity, und geben Sie com.matthewrathbone.eastersays.myapp als Paket im Manifest an. Fügen Sie der Bibliothek jedoch nicht die Ebene „myapp“ hinzu, um den Projektpfad im Manifest vom Pfad des Bibliotheksframeworks zu unterscheiden.
– onosendai
2. Juni 2012 um 23:11 Uhr
iqadd.com/item/noclassdeffounderror-adt-fix :Link defekt :/
– Nischant.
21. September 2015 um 18:57 Uhr