web-dev-qa-db-fra.com

Android Activité ClassNotFoundException - tout essayé

Je viens de refactoriser une application dans une bibliothèque de framework et une application, mais maintenant, lorsque j'essaie de démarrer l'application dans l'émulateur, la trace d'erreur de pile suivante s'affiche:

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

Habituellement, cela signifie que le fichier manifeste est faux d’une certaine manière, mais j’ai vérifié deux fois tout ce à quoi je peux penser.

Voici mon cours d'activité:

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;
        }
       };
      }
    }

Comme vous pouvez le constater, il est correctement répertorié dans le manifeste:

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

Je ne sais pas comment résoudre ce problème et j'apprécierais toute aide. J'ai scanné beaucoup de questions similaires sur SO sans voir ce comportement particulier.

Plus d'informations:

  • J'ai vérifié à l'intérieur de l'APK généré et la classe a une entrée dans le fichier classes.dex
  • J'ai essayé de nettoyer/construire le projet dans Eclipse
  • J'ai essayé d'utiliser une toute nouvelle image de périphérique qui ne contient pas déjà une copie de l'APK
  • J'ai changé le projet de bibliothèque en un fichier Java standard, puis je suis redevenu un projet Android, aucune différence
  • L'ajout du résumé SimonSaysActivity au manifeste ne fait aucune différence.
  • J'ai essayé de transformer chaque dépendance en un projet de bibliothèque Android) et de synchroniser la version Android dont ils ont besoin, mais cela n'a pas aidé.

Trouvé la solution (voir ci-dessous). À tous ceux qui ont posté une réponse/un commentaire: Merci à vous tous, merci de m'avoir aidé à résoudre les problèmes!

On dirait que ceci est introduit par une mise à niveau des outils du SDK. Merci à @Nick ci-dessous dans les commentaires pour ce lien: http://iqadd.com/item/noclassdeffounderror-adt-fix

80
Matthew Rathbone

J'ai passé du temps à jouer avec mon propre projet et je suis capable de reproduire votre problème et d'obtenir exactement le même tracé de pile d'exceptions lorsque j'essaie d'exécuter mon projet principal. Je pense donc que cela pourrait en être la cause:

Tout comme ce que je pensais, tout dépend de la façon dont vous référencez votre projet de bibliothèque Android dans le projet principal Android, un simple paramètre de configuration Eclipse.

Le mauvais moyen:
Faites un clic droit sur le projet principal, choisissez Properties -> Java Build Path -> Projects -> Add..., cela ajoute le Android en tant que projet de dépendance dans Android), cela ne fonctionne pas. Si toutes les ressources liées à Android sont requises, sont définis dans le projet principal, vous n’obtiendrez aucune erreur lors de la compilation, mais lors de l’exécution de l’application, vous obtenez l’exception décrite dans la question.

La manière correcte:
Faites un clic droit sur le projet principal, choisissez Properties -> Android, dans la section Bibliothèque, ajoutez votre Android ici. Consultez le guide de développement officiel Référencement d'un projet de bibliothèque . Cela devrait régler tout votre problème. Remarque: que vous devez utiliser le chemin relatif référence au projet de bibliothèque Android), comme indiqué dans le Projet de bibliothèque - Considérations de développement .

J'espère que cela t'aides.

147
yorkw

j'ai testé le code que vous avez donné, et cela fonctionne bien. essayez de changer "SimonSaysActivity" pour "simplement Activity" et voyez par vous-même que cela fonctionne.

la raison pour laquelle cela ne fonctionne pas est que SimonSaysActivity ne prolonge pas Activity (ce qui, à mon avis, n'est pas attribuable à cette erreur) ou que l'ordre du chemin de génération est erroné.

pour aller à l'ordre du chemin de construction, allez à:

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

mon ordre de base est le suivant: projet src, projet gen, Android 4.0.3, Android dépendances.

ce problème se produit généralement lorsque vous utilisez des bibliothèques.

8

Je viens de refactoriser une application dans une bibliothèque et une application.

Je ne suis pas tout à fait sûr de ce que vous essayez de dire ici, mais le fait que vous ayez utilisé le mot "refactorisé" ici me porte à croire que vous comprenez mal le concept de projet de bibliothèque.


Quels projets de bibliothèque sont:

Un projet de bibliothèque est un projet de développement contenant un code source et des ressources partagés. D'autres projets Android peuvent référencer le projet de bibliothèque et inclure ses sources compilées dans leurs fichiers .apk au moment de la compilation.

Quels projets de bibliothèque ne sont pas:

Un projet de bibliothèque diffère d'un projet standard Android en ce sens que vous ne pouvez pas le compiler directement sur un seul .apk et exécutez-le sur un périphérique Android. Vous ne pouvez pas utiliser un projet Android en tant que projet de bibliothèque et disposer ensuite d'un autre Android projet étendre le projet de bibliothèque. Cela ne fonctionne pas de cette façon.


Ceci étant dit, j'étudierais la structure de votre projet de bibliothèque et m'assurerais que vous avez configurez-le correctement . Vous pouvez utiliser votre bibliothèque pour stocker du code/des ressources partagées, mais si votre bibliothèque tente de se comporter comme s'il s'agissait d'un _.apk dans le projet de bibliothèque lui-même, vous avez probablement mal agi. Je crois qu'un ClassNotFoundException serait jeté si c'était le cas. Pour résoudre le problème, je construisais le projet de bibliothèque à partir de rien, plutôt que d'essayer de convertir le projet Android en un projet de bibliothèque. Cela vous évitera de vous heurter à de minuscules bugs gênants. .

N'hésitez pas à poster plus de code si vous rencontrez toujours des problèmes. Vous devriez également élaborer un peu plus sur la structure (et le but) de votre projet de bibliothèque ... pourquoi vous avez décidé d’en utiliser un, comment vous l’avez créé, etc.

2
Alex Lockwood

Pour Eclipse Kepler (Mac): Contrôle-cliquez sur projet -> Android Outils -> ajouter une bibliothèque de support

2
PSchuette

J'ai eu ce problème avec un projet sur lequel je travaillais, même si mon cas était différent. Si quelqu'un ne peut toujours pas trouver la solution à son problème, essayez de vérifier ceci:

Dans Eclipse:

Project properties -> Java Build Path -> Source tab

À l'intérieur, vous trouverez une liste de tous les dossiers sources à compiler et à placer dans l'apk généré à chaque fois pour construire votre projet (et / gen). Typiquement:

>MyProject/gen
>MyProject/src

Ce que vous voulez être sûr est que dans chacun de vos dossiers source (excluez / gendonc seulement / src dans ce cas) l'élément Output folder pointe vers le dossier de sortie par défaut, qui est MyProject/bin/classes. Pour ce faire, sélectionnez le dossier de sortie et cliquez sur Supprimer dans le jeu de boutons de droite (cela le fera pointer vers le dossier par défaut).

Si vous ne voyez pas le dossier de sortie du sous-élément, cochez la case "Autoriser les dossiers de sortie pour les dossiers sources" juste en dessous de la liste.

2
Gonzalo

retirer classes.dex de bin et reconstruire le projet

1
Afzaal Iftikhar

Bien que cela ne soit pas applicable à tout le monde, j'ai récemment rencontré ce problème, car mon projet ne parvenait pas à établir de liaison avec une bibliothèque partagée présente sur le périphérique. J'avais oublié de spécifiez dans mon manifeste que ma candidature <uses-library>.

1
lase

classNotFoundException in Java est une sous-classe de Java.lang.Exception et vient quand Java La machine virtuelle tente de charger une classe particulière et ne trouve pas la classe demandée dans classpath.

En savoir plus: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-Java-example.html#ixzz3yX3WBeFA

Essayez d'aller à Project -> Properties -> Java Build Path -> Order & Export Et Confirmez Android Bibliothèques privées sont cochés pour votre projet et pour tous les autres projets de bibliothèque que vous utilisez dans votre application.

Comment traiter avec la ClassNotFoundException

  1. Vérifiez que le nom de la classe demandée est correct et que le fichier approprié .jar existe dans votre classpath. Sinon, vous devez l’ajouter explicitement au chemin de classe de votre application.
  2. Si le fichier .jar spécifié existe dans votre chemin d'accès aux classes, le chemin d'accès aux classes de votre application est remplacé et vous devez trouver le chemin d'accès aux classes exact utilisé par votre application.
  3. Si l'exception est provoquée par une classe tierce, vous devez identifier la classe qui lève l'exception, puis ajouter les fichiers . Jar manquants dans votre classpath.
1
IntelliJ Amiya

la solution fournie par @yorkw est absolument correcte. J'ai eu un problème supplémentaire, dans l'un des fichiers de mise en page, j'avais mal mentionné le nom absolu. Ça aurait dû être

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

plutôt je l'avais mis

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

après avoir résolu ces problèmes, cela a bien fonctionné.

0
Himadri Pant

Croyez-le ou non, le correctif pour moi était de supprimer l'ancienne version (2.0) de la bibliothèque Google Analytics de mon projet, après avoir tout essayé pendant au moins 4 heures. Bien sûr, une mise à jour de cette bibliothèque pourrait également être la solution. Donc, cela pourrait être un problème de versioning jar de dépendance.

0
Criss

J'ai eu le même problème et j'ai passé presque toute une journée à essayer toutes sortes de choses. L'application a été trouvée lorsqu'elle est déployée à partir d'un ordinateur, mais pas sur celui-ci. En fin de compte, il s’avère être un élément manquant Java nature! Etrange comment il m’a montré Java les chemins de construction, ordre/export et tout cela, mais pas encore ayez un Java nature. :( espérons que cela fera gagner beaucoup de temps à quelqu'un d'autre

0
Luke

Quelles interfaces ou classes parentes sont utilisées/étendues par SimonSaysActivity et sont-elles disponibles dans la version de Android que vous utilisez?). J'ai rencontré des problèmes similaires dans lesquels mon activité implémentait une interface API qui n'était pas disponible sur la version de Android que j'utilisais.

Dans mon cas, mon activité a implémenté l'interface PopupMenu.OnDismissListener qui n'est disponible que dans l'API 14, mais lorsque j'ai exécuté l'application sur mon appareil 2.3, j'ai reçu une exception Java.lang.NoClassDefFoundError pour l'activité.

0
Charles Harley

Si vous avez suivi toutes les astuces (vérifié les bibliothèques privées, etc.) et avez toujours le bogue. Vérifiez votre manifeste pour cette ligne de code dans le tag d'application

    Android:hasCode="false" 

Enlevez-le et soyez heureux. (J'étais enfin) :)

0
Corona