Android Activity ClassNotFoundException - alles ausprobiert

82

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

Matthew Rathbone
quelle
1
Befindet sich Ihre Aktivität in der Bibliothek oder in der Anwendung?
Jeshurun
Es ist in der Anwendung. Es erweitert eine Basisaktivität im Bibliotheksprojekt.
Matthew Rathbone
Bauen Sie mit Ameise oder mit ADT? Es scheint, dass Dex-Dateien keine Bibliotheksklassen enthalten.
Tomasz Gawel
Der Fehler impliziert, dass Ihr Aktivitätsspeicherort com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity ist - eindeutig nicht richtig. Versuchen Sie, dem Projektpaket, das nicht in der Bibliothek vorhanden ist, eine Paketebene hinzuzufügen, z. B. ... eastersays.myapp.EasterSimonSaysActivity, und geben Sie im Manifest com.matthewrathbone.eastersays.myapp als Paket an. Fügen Sie der Bibliothek jedoch nicht die Ebene 'myapp' hinzu, um den Projektpfad im Manifest vom Bibliotheksframeworkpfad zu unterscheiden.
Gunnar Karlsson
1
iqadd.com/item/noclassdeffounderror-adt-fix : Link unterbrochen: /
Nishant.

Antworten:

148

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 -> Androidim 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.

yorkw
quelle
1
Du mein Freund bist ein Genie. Das Interessante daran ist, dass ich immer eine Bibliothek "falsch" aufgenommen habe, und es hat funktioniert. Als ich mich in zwei Bibliotheken umgestaltete, dachte ich, dass ich das anders gemacht habe. Sie haben mir gerade Stunden und Stunden Arbeit erspart.
Matthew Rathbone
Das Komische ist, dass es vorher funktioniert hat. Ich denke, ein Upgrade meiner SDK-Tools hat das Verhalten geändert. Es war sehr nicht offensichtlich.
Matthew Rathbone
3
Ja, das Aktualisieren der SDK-Tools auf> ADT 17 führt diesen Fehler aufgrund einer Änderung in der Art und Weise ein, wie die aktuelle ADT-Version Bibliotheken behandelt. Überprüfen Sie heraus: iqadd.com/item/noclassdeffounderror-adt-fix
Nick
2
Das Update auf ADT 22 ergab ein ähnliches Problem: stackoverflow.com/questions/16596969/…
Niels
7
Würde mich bitte jemand wissen lassen, wo ich das finden kann Properties? Ich kann es nirgendwo finden.
lebhaft
8

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:

project->properties->Java build path->order and export .

Meine Grundreihenfolge lautet: Projekt src, Projekt gen, Android 4.0.3, Android-Abhängigkeiten.

Dieses Problem tritt normalerweise auf, wenn Sie Bibliotheken verwenden.

Android-Entwickler
quelle
Sie haben also Recht, wenn ich die Aktivität direkt erweitere, funktioniert sie. Mein Build-Auftrag stimmt mit Ihrem überein, daher kann ich keinen Weg finden, dies zu beheben. Irgendwelche anderen Ideen?
Matthew Rathbone
das ist wirklich seltsam. versuche das 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 setzen). Außerdem habe ich noch eine andere Frage: Hast du eine Klasse namens "Aktivität" erstellt und sie vielleicht anstelle der von Android erweitert?
Android-Entwickler
Es gibt 2 Bibliotheksprojekte, das zweite (Engine) hängt sowohl von simonSays als auch vom Android-Projekt ab. Ich habe jede Kombination von Build-Reihenfolge ausprobiert und das Engine-Projekt aus SimonSays exportiert. Antwort auf Ihre Frage: Ich habe nirgendwo eine Klasse namens Aktivität.
Matthew Rathbone
Der Motor ist der Kern. andere Projekte sollten es verwenden und nicht das Gegenteil. Nur das Projekt, das ein Android-Projekt ist (dh kein Bibliotheksprojekt), sollte das Manifest haben, das die Dekleration 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
1
Sie müssen haben . Es ist nur so, dass die Manifestdatei sehr kurz sein kann und fast nichts enthält. Überprüfen Sie auch in der Datei project.properties (in jedem der Projekte), ob das Ziel-SDK 15 ist, da dies die aktuellste Version ist. Wenn Sie möchten, können Sie mir eine PM senden und ich werde die Projekte reparieren.
Android-Entwickler
2

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 "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 .apkDatei 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 .apkinnerhalb des Bibliotheksprojekts selbst separat , haben Sie wahrscheinlich etwas falsch gemacht. Ich glaube, ein ClassNotFoundExceptionwü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.

Alex Lockwood
quelle
Ja, ich habe die einzelnen Projekte absolut richtig behandelt. Es war die Art und Weise, wie ich auf die Bibliotheksprojekte verwies, die das Problem tatsächlich verursachten. Vielen Dank für die tolle Hilfe!
Matthew Rathbone
np ... es war einen Versuch wert, haha
Alex Lockwood
2

Für Eclipse Kepler (Mac): Klicken Sie bei gedrückter Ctrl-Taste auf Projekt -> Android Tools -> Support-Bibliothek hinzufügen

PSchuette
quelle
Das hat es für mich behoben. Nur die v4-support.jar als Bibliothek einzuschließen, hat nicht funktioniert.
Whiteagle
2

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:

Project properties -> Java Build Path -> Source tab

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:

>MyProject/gen
>MyProject/src

Sie sollten sicher sein, dass sich das Element in jedem Ihrer Quellordner (ausgenommen / gen , in diesem Fall nur / src ) Output folderim Standardausgabeordner befindet MyProject/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

Gonzalo
quelle
1

classNotFoundException in Java ist eine Unterklasse von java.lang.Exception und Comes, wenn Java Virtual Machine versucht, eine bestimmte Klasse zu laden und die angeforderte Klasse im Klassenpfad nicht gefunden hat.

Lesen Sie mehr: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

Versuchen Sie, Android Private Libraries aufzurufenProject -> 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

  1. Stellen Sie sicher, dass der Name der angeforderten Klasse korrekt ist und dass die entsprechende JAR- Datei in Ihrem Klassenpfad vorhanden ist . Wenn nicht, müssen Sie es explizit zum Klassenpfad Ihrer Anwendung hinzufügen.
  2. Wenn 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.
  3. Wenn die Ausnahme von einer Klasse eines Drittanbieters verursacht wird, müssen Sie die Klasse identifizieren, die die Ausnahme auslöst, und dann die fehlenden JAR- Dateien in Ihren Klassenpfad einfügen .
IntelliJ Amiya
quelle
1

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>.

lase
quelle
1

Entfernen Sie classes.dex aus bin und erstellen Sie das Projekt neu

Afzaal Iftikhar
quelle
0

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.

Charles Harley
quelle
Alle Versionen sind gleich, Android 2.2.
Matthew Rathbone
0

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

Luke
quelle
0

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

    android:hasCode="false" 

Entferne es und sei glücklich. (Ich war endlich) :)

Corona
quelle
0

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

<android.support.v4.view.ViewPager xmlns:android="...

eher hatte ich es gesagt

<android.support.v4.app.view.ViewPager xmlns:android="...

Nachdem diese behoben waren, funktionierte es gut.

Himadri Pant
quelle
0

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.

Criss
quelle
0

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!

Junaid Bashir
quelle
-1

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 :)

kaushal trivedi
quelle