Ich habe gerade eine App in eine Framework-Bibliothek und eine Anwendung umgestaltet, aber jetzt, wenn ich versuche, die App im Emulator zu starten, erhalte ich die folgende Fehlerstapel-Ablaufverfolgung:
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 überprüft, was mir einfällt.
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:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.matthewrathbone.eastersays"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".EasterSimonSaysActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Ich habe keine Ahnung, wie ich das beheben soll, und würde mich über jede Hilfe freuen. Ich habe viele ähnliche Fragen zu SO gescannt, ohne dieses spezielle Verhalten zu sehen.
Mehr Info:
- Ich habe in der generierten APK nachgesehen 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, auf dem noch keine Kopie der APK vorhanden ist
- Ich habe das Bibliotheksprojekt in ein reguläres Java-Projekt geändert und dann wieder in ein Android-Projekt geändert, kein Unterschied
- Das Hinzufügen der Zusammenfassung SimonSaysActivity zum Manifest macht keinen Unterschied.
- Ich habe versucht, jede Abhängigkeit zu einem Android-Bibliotheksprojekt zu machen und die benötigte Android-Version zu synchronisieren. Es hat nicht geholfen
Die Lösung gefunden (siehe unten). An alle, die eine Antwort / einen Kommentar gepostet haben: Ihr alle rockt, danke, dass ihr mir geholfen habt, die Probleme zu lösen!
Dies wird anscheinend durch ein Upgrade der SDK-Tools eingeführt. Vielen Dank an @Nick unten in den Kommentaren zu diesem Link: http://iqadd.com/item/noclassdeffounderror-adt-fix
quelle
Antworten:
Ich habe einige Zeit mit meinem eigenen Projekt verbracht und kann Ihr Problem replizieren und beim Versuch, mein Hauptprojekt auszuführen, genau den gleichen Ausnahmestapel-Trace erhalten. Ich denke, dies könnte die Ursache sein:
Genau wie ich dachte, geht es darum, wie Sie Ihr Android-Bibliotheksprojekt im Android-Hauptprojekt referenzieren, einer einfachen Eclipse-Konfigurationseinstellung.
Der falsche Weg:
Klicken Sie mit der rechten Maustaste auf das Hauptprojekt. Wählen Sie
Properties -> Java Build Path -> Projects -> Add...
diese Option, um das Android-Bibliotheksprojekt als Abhängigkeitsprojekt im Erstellungspfad des Android-Hauptprojekts hinzuzufügen. Dies funktioniert nicht. Wenn alle erforderlichen Android-bezogenen Ressourcen im Hauptprojekt definiert sind, wird beim Kompilieren kein Fehler angezeigt. Beim Ausführen der Anwendung wird jedoch die in der Frage beschriebene Ausnahme angezeigt.Der richtige Weg:
Klicken Sie mit der rechten Maustaste auf das Hauptprojekt und wählen Sie
Properties -> Android
im Abschnitt Bibliothek hier Ihr Android-Bibliotheksprojekt aus. Lesen Sie den offiziellen Entwicklerleitfaden . Referenzieren eines Bibliotheksprojekts . Dies sollte Ihr gesamtes Problem beheben. Beachten Sie auch, dass Sie eine relative Pfadreferenz für das eigentliche Android-Bibliotheksprojekt verwenden müssen, wie in den Überlegungen zum Bibliotheksprojekt - Entwicklung angegeben .Hoffe das hilft.
quelle
Properties
? Ich kann es nirgendwo finden.Ich habe den Code getestet, den Sie gegeben haben, und es funktioniert gut. Versuchen Sie, die Option "SimonSaysActivity erweitert" in "Aktivität erweitern" zu ändern, und überzeugen Sie sich selbst, dass dies funktioniert.
Der Grund, warum es nicht funktioniert, ist entweder, dass SimonSaysActivity die Aktivität nicht erweitert (was ich nicht glaube, dass Sie diesen Fehler gemacht haben), oder dass die Reihenfolge des Erstellungspfads falsch ist.
Um zur Reihenfolge des Erstellungspfads zu gelangen, gehen Sie zu:
Meine Grundreihenfolge lautet: Projekt src, Projekt gen, Android 4.0.3, Android-Abhängigkeiten.
Dieses Problem tritt normalerweise auf, wenn Sie Bibliotheken verwenden.
quelle
Ich bin mir nicht ganz sicher, was Sie hier sagen wollen, aber die Tatsache, dass Sie hier das Wort "refactored" verwendet haben, lässt mich glauben, dass Sie das Konzept eines Bibliotheksprojekts falsch verstehen.
Was 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 Kompilierungszeit in ihre APK-Dateien aufnehmen.
Was Bibliotheksprojekte nicht sind :
Ein Bibliotheksprojekt unterscheidet sich von einem Standard-Android-Projekt dadurch, dass Sie es nicht direkt in eine einzelne
.apk
Datei kompilieren und auf einem Android-Gerät ausführen können. Sie können ein Android-Projekt nicht als Bibliotheksprojekt verwenden und dann das Bibliotheksprojekt durch ein anderes Android-Projekt erweitern lassen . So funktioniert das nicht.Trotzdem würde ich die Struktur Ihres Bibliotheksprojekts untersuchen und sicherstellen, dass Sie es richtig eingerichtet haben . Es ist in Ordnung, Ihre Bibliothek zum Speichern von gemeinsam genutztem Code / freigegebenen Ressourcen zu verwenden. Wenn Ihre Bibliothek jedoch versucht, sich so zu verhalten, als wäre sie
.apk
innerhalb des Bibliotheksprojekts selbst separat , haben Sie wahrscheinlich etwas falsch gemacht. Ich glaube, einClassNotFoundException
würde geworfen werden, wenn dies der Fall wäre. Um das Problem zu beheben, habe ich das Bibliotheksprojekt einfach von Grund auf neu erstellt, anstatt zu versuchen, das Android-Projekt in ein Bibliotheksprojekt zu konvertieren. Das verhindert, dass Sie auf winzige, nervige Fehler stoßen.Fühlen Sie sich frei, mehr Code zu posten, wenn Sie immer noch Probleme haben. Sie sollten auch etwas mehr über die Struktur (und den Zweck) Ihres Bibliotheksprojekts erfahren ... warum Sie sich für eines entschieden haben, wie Sie es erstellt haben usw.
quelle
Für Eclipse Kepler (Mac): Klicken Sie bei gedrückter Ctrl-Taste auf Projekt -> Android Tools -> Support-Bibliothek hinzufügen
quelle
Ich hatte dieses Problem mit 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, überprüfen Sie Folgendes:
In Eclipse:
Im Inneren finden Sie eine Liste mit allen Quellordnern, die jedes Mal kompiliert und in die generierte apk eingefügt werden müssen, um Ihr Projekt (und / oder ) zu erstellen . Tipp:
Sie sollten sicher sein, dass sich das Element in jedem Ihrer Quellordner (ausgenommen / gen , in diesem Fall nur / src )
Output folder
im Standardausgabeordner befindetMyProject/bin/classes
. Wählen Sie dazu den Ausgabeordner aus und klicken Sie in den rechten Schaltflächen auf Entfernen (dadurch wird auf den Standardordner verwiesen).Wenn Sie den Ausgabeordner des Unterelements nicht sehen können, aktivieren Sie "Ausgabeordner für Quellordner zulassen" direkt unter der Liste
quelle
Lesen Sie mehr: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA
Versuchen Sie, Android Private Libraries aufzurufen
Project -> Properties -> Java Build Path -> Order & Export
und zu bestätigen , dass diese für Ihr Projekt und für alle anderen Bibliotheksprojekte, die Sie in Ihrer Anwendung verwenden, aktiviert sind.Umgang mit der ClassNotFoundException
quelle
Dies gilt zwar nicht für alle, aber ich hatte kürzlich dieses Problem, weil mein Projekt keine Verknüpfung mit einer auf dem Gerät vorhandenen gemeinsam genutzten Bibliothek herstellen konnte. Ich hatte vergessen , in meinem Manifest anzugeben, dass meine Bewerbung
<uses-library>
.quelle
Entfernen Sie classes.dex aus bin und erstellen Sie das Projekt neu
quelle
Welche Schnittstellen oder übergeordneten Klassen verwendet / erweitert SimonSaysActivity und sind sie in der von Ihnen verwendeten Android-Version verfügbar? Ich habe ähnliche Probleme gesehen, bei denen meine Aktivität eine API-Schnittstelle implementiert hat, die in der von mir verwendeten Android-Version nicht verfügbar war.
In meinem Fall hat meine Aktivität die Schnittstelle PopupMenu.OnDismissListener implementiert, die nur in API 14 verfügbar ist. Als ich die App jedoch auf meinem 2.3-Gerät ausführte, erhielt ich eine java.lang.NoClassDefFoundError-Ausnahme für die Aktivität.
quelle
Ich hatte das gleiche Problem und verschwendete den größten Teil des Tages damit, alle möglichen Dinge auszuprobieren. Die App wurde bei der Bereitstellung von einem PC aus ausgeführt, jedoch nicht auf diesem einen PC. Am Ende war es eine fehlende Java-Natur! Seltsam, wie es mir zeigte, Java-Erstellungspfade, Bestellung / Export und all das, aber noch keine Java-Natur. :( Hoffe das spart jemand anderem viel Zeit
quelle
Wenn Sie alle Hinweise befolgt haben (überprüfen Sie die privaten Bibliotheken usw.) und immer noch den Fehler haben. Überprüfen Sie Ihr Manifest auf diese Codezeile im Application-Tag
Entferne es und sei glücklich. (Ich war endlich) :)
quelle
Die von @yorkw bereitgestellte Lösung ist absolut korrekt. Ich hatte ein zusätzliches Problem, in einer der Layoutdateien hatte ich den absoluten Namen falsch erwähnt. Es hätte sein sollen
eher hatte ich es gesagt
Nachdem diese behoben waren, funktionierte es gut.
quelle
Ob Sie es glauben oder nicht, die Lösung für mich bestand darin, die alte Version (2.0) der Google Analytics-Bibliothek aus meinem Projekt zu entfernen, nachdem ich alles mindestens 4 Stunden lang ausprobiert hatte. Natürlich könnte auch ein Update dieser Bibliothek die Lösung sein. Es könnte sich also um ein Problem bei der Versionierung von Abhängigkeits-JARs handeln.
quelle
Ich habe diese Art von Fehler bekommen und ich habe alles versucht, aber nicht die Lösung bekommen. Dann habe ich herausgefunden, ob Sie Bibliothek als AAR-Datei verwenden, dann müssen Sie alle Abhängigkeiten Ihrer AAR-Bibliothek zu Ihrer App gradle.build-Datei hinzufügen. Wenn jemand keine Lösung gefunden hat, versuchen Sie dies!
quelle
Ich bekam das gleiche Problem. Aber dann habe ich die aktuelle Struktur der Anwendung überprüft. Ich habe festgestellt, dass ältere Anwendungsstrukturen (ich weiß nicht, wann sie von Android-Framework-Entwicklern geändert werden) einen Ordnernamen haben,
"lib"
der jetzt lautet"libs"
. Ich migriere alle JAR-Dateien in "libs" und der Fehler ist verschwunden. Ich hoffe das kann jemandem helfen :)quelle