web-dev-qa-db-fra.com

Android: impossible d'instancier l'activité / ClassNotFoundException

J'ai récemment publié une application sur le marché et je reçois maintenant une erreur de la part d'un utilisateur, l'application se bloque probablement au démarrage. Malheureusement, je ne peux pas le contacter directement et l'application fonctionne bien dans l'émulateur ainsi que sur mon téléphone (et les téléphones de certains amis).
EDIT: Je suppose que cela arrive à plus d'un utilisateur car j'ai reçu des commentaires sur le marché comme "se bloque au démarrage" ou "ne fonctionne pas". Je n'ai reçu que cette trace de pile, mais il n'y a pas d'informations sur la configuration, l'appareil, Android, etc.

L'application est une simple table d'harmonie, donc il n'y a vraiment pas de magie impliquée, mais je ne comprends pas pourquoi elle échoue sur certains téléphones. Voici la trace de pile que j'obtiens, j'espère que n'importe qui peut m'aider:

Java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.app/com.my.app.SoundMachine}: Java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2585)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2679)
at Android.app.ActivityThread.access$2300(ActivityThread.Java:125)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2033)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:123)
at Android.app.ActivityThread.main(ActivityThread.Java:4627)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:521)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:876)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:634)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.ClassNotFoundException: com.my.app.SoundMachine in loader dalvik.system.PathClassLoader[/mnt/asec/com.my.app-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.Java:243)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:573)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:532)
at Android.app.Instrumentation.newActivity(Instrumentation.Java:1021)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2577)
... 11 more

Voici les deux premières lignes de mon activité:

public class SoundMachine extends Activity {
  private SoundManager mSoundManager;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

EDIT: Ceci est le (presque) complet surCréer:

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSoundManager = new SoundManager();
    mSoundManager.initSounds(getBaseContext());

    int counter = 0;
    for (Integer soundFile : soundFiles) {
      counter++;
      mSoundManager.addSound(counter, soundFile);
    }

    ImageButton SoundButton1 = (ImageButton) findViewById(R.id.sound1);
    SoundButton1.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.playSound(1);
      }
    });
    SoundButton1.setOnLongClickListener(new OnLongClickListener() {
      public boolean onLongClick(View v) {
        saveSoundChoice(soundFiles[0], soundNames[0]);
        return true;
      }
    });

(...more of this...)

    Button StopButton = (Button) findViewById(R.id.stopbutton);
    StopButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mSoundManager.stopAll();
      }
    });
  }

Et voici mon manifeste:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.my.app" Android:installLocation="preferExternal"
    Android:versionCode="9" Android:versionName="1.2">
    <application Android:icon="@drawable/icon" Android:label="@string/app_name">
        <activity Android:name=".SoundMachine" Android:label="@string/app_name"
            Android:screenOrientation="portrait">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-sdk Android:minSdkVersion="3" Android:targetSdkVersion="8" />
</manifest>

Donc, toutes les erreurs possibles que j'ai déjà lues ici et dans certains forums ne s'appliquent pas à mon application.

  • L'activité est présente dans le manifeste.
  • La super-méthode est appelée dans la méthode overriden.
  • ContentView est défini avant d'accéder aux éléments de la vue.

Je sais qu'il est difficile de localiser la source d'une erreur sans pouvoir la reproduire, mais peut-être que quelqu'un a une idée brillante et peut m'aider.

Quelques questions:

  • Ai-je besoin de la partie "intention" dans le manifeste? Eclipse l'a créé lorsque j'ai créé le projet. (Oui, selon Mayra)
  • Faut-il appeler la super-méthode là où elle est? (Oui, selon Mayra)

EDIT: La principale question qui reste maintenant est: en quoi le chemin dans PathClassLoader est différent de mon nom de package? La page publiée par John J Smith semble traiter le même problème, mais je ne comprends pas le correctif qui y a été appliqué.

Merci, Select0r

68
Select0r

Depuis la mise à jour ADT vers la révision 22 (mai 2013), vous devez cocher la case "Bibliothèques privées Android" dans Projet -> Propriétés -> Java Chemin de génération -> Ordre et exportation dans Eclipse pour que vos anciens projets se débarrassent de cette exception ...

38
Milan Doubek

J'ai résolu ce problème en sélectionnant: Projet-> propriétés-> commande et exportation

sélectionnez tous les fichiers jar externes. nettoyer et construire résolu le problème

38
user1219096

Je viens de recevoir la même erreur (Impossible d'instancier l'activité ...) avec Opera Mini. Opera Mini était sur la carte SD (déplacé vers la carte SD dans le paramètre d'application). L'erreur semble être liée au fait que j'ai échangé la carte SD hier. L'appareil a été arrêté, j'ai copié toutes les données de l'ancienne carte vers la nouvelle carte (avec cp -a), puis inséré la nouvelle carte et redémarré l'appareil. Tout semble fonctionner comme prévu, mais je vois maintenant que toutes les applications sur la carte SD se bloquent avec la même erreur.

  • Appareil: HTC Desire HD (Android 2.2)
  • Ancienne carte SDHC: SanDisk 8 Go classe 4
  • Nouvelle carte SDHC: Kingston 16 Go classe 4

Je dirais donc qu'il s'agit d'un bogue Android et non quelque chose qui peut être corrigé par les développeurs d'applications.

Voir également: http://Android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html

Il a toujours été le cas lorsque vous échangez des cartes SD sur un appareil Android, si vous copiez physiquement le contenu de l'ancienne carte sur la nouvelle, le système utilisera les données sur la nouvelle comme si rien n'avait changé. C'est également le cas des applications installées sur la carte SD. "

Cela semble être incorrect.

20
perja

Cela m'est arrivé lorsque j'ai refactorisé l'un de mes noms de package et que l'outil de refactorisation a supprimé le premier "." de tous mes noms d'activité. donc dans AndroidManifest.xml, j'ai dû changer Android: name = "MyActivity" en Android: name = ". MyActivity"

j'espère que cela aide quelqu'un, je viens de perdre un tas de temps o

7
Bob

Cela ne s'applique pas à la question du PO, mais c'est le mien et il m'a fallu un certain temps pour le comprendre: lorsque vous utilisez l'API Google Maps, assurez-vous d'avoir inclus la déclaration de bibliothèque dans le manifeste de l'application.

Par exemple:

public class MyActivity extends MapActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

}

Dans AndroidManifest.xml:

<application>
    <uses-library Android:name="com.google.Android.maps" />
    <activity Android:name="MyActivity" 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>
6
Paul Lammertsma

Regardez le package défini en haut du fichier manifiest et assurez-vous qu'il correspond au package dans lequel votre classe est définie.

Mon problème était que je n'avais pas de noms de paquets correspondants.

Également énusre que vous avez un dossier nommé "libs" avec un 's'. Mettez tous les fichiers jar que vous avez ajoutés à l'intérieur et ajoutez-les au chemin de génération.

4
eliteslayer

J'ai eu le même problème que toi et, après des heures de recherche, j'ai découvert quelque chose d'intéressant. Je vais essayer d'exposer cela aussi clairement que possible:

  • J'ai créé un projet avec un package appelé "myapp.sound" contenant l'activité. Le programme s'est déroulé normalement;
  • J'ai renommé ce package en l'appelant "app.soundapp" et le programme fonctionnait toujours normalement.

Cependant, dans le fichier manifest.xml du programme, il y avait quelque chose d'étrange: le nom du paquet était l'ancien "myapp.sound". J'ai changé de manifeste avec un nouveau nom correct et, à partir de ce moment, notre erreur s'est produite. Je ne sais pas pourquoi, mais il semble que le "changeur de nom de package" d'Eclipse ne mette pas à jour toutes les dépendances. Si ce n'est pas strictement nécessaire, ne renommez pas le package contenant l'activité. Peut-être que pour résoudre votre problème, vous devez créer un nouveau projet et y copier tous vos Java class.

4
superpuccio

Je ne sais pas pourquoi le chemin dans le PathClassLoader est différent de votre nom de package, mais lorsque vous testez sur l'émulateur, essayez de forcer la fermeture, puis exécutez-le à nouveau, comme ceci lien

4
John J Smith

J'ai vu le même message d'erreur après avoir effectué une simple mise à niveau de mon application. Corrigé en faisant ceci:

Project->Build automatically OFF
Project->Clean->Selcting my project

Ensuite, j'ai fait une nouvelle exportation de mon application signée, et cela a fonctionné.

3
Jbruntt

Semblable à Bobf Cali, j'ai vu cette erreur pour la première fois après avoir renommé mon package de base pour changer la section "exemple". Pour y remédier, j'ai dû supprimer mes répertoires gen et bin, nettoyer le projet et reconstruire.

Remarque selon la version du plug-in Eclipse Android que vous utilisez (le cas échéant), vous devrez peut-être également mettre à jour les noms des activités dans votre AndroidManifest.xml

3
J M Rossy

Je rencontrais ce problème lorsque j'incluais des projets Java dans mon chemin de construction pour mon projet Android ciblant JavaSE-1.7.

Pour une raison quelconque, mon émulateur ne lancerait pas une classe non trouvée si le projet Java qu'il incluait avait été créé à l'origine pour cibler JavaSE-1.6. Eclipse me donnerait un avertissement "Le chemin de génération spécifie l'environnement d'exécution JavaSE- 1.6. Aucun espace JRE installé dans l'espace de travail n'est strictement compatible avec cet environnement. "Mais l'émulateur Android se lancerait et je n'obtiendrais pas d'exception classnotfoundexception

Donc, si vous incluez des projets qui ciblent JavaSE-1.7, refaites-les en ciblant JavaSE-1.6 et cela peut résoudre votre problème.

Bonne chance!

3
Mentos

Ce problème peut également se produire si vous avez un constructeur avec un ou plusieurs paramètres dans votre classe d'activité.

3
Johannes Svensson

Ce problème peut exister lorsque vous modifiez le nom de votre classe et mettez à jour le fichier manifeste et que le fichier manifeste n'est pas mis à jour sur l'émulateur. Essayez de désinstaller l'application de l'émulateur, puis réinstallez-la. Cela fonctionnera.

3
Balaji

Consultez cet article: http://www.androidguys.com/2010/05/22/storing-apps-sd-froyo/ qui explique les limites du stockage d'applications sur des cartes SD. Si vos utilisateurs ont leur carte SD montée par un ordinateur, cela pourrait rendre la classe SoundMachine invisible. Et je me demande si la commande cp échoue (tentative de perja de corriger) car elle pourrait changer la propriété des fichiers de sorte que l'ID utilisateur de l'application et la propriété des fichiers ne correspondent plus.

2
Dave MacLean

Assurez-vous que votre répertoire/src est répertorié dans vos projets> propriétés> chemin de génération Java> source

2
AnnaM

Êtes-vous sûr que le nom de votre package est unique? Je ne sais pas ce qui se passe si l'utilisateur a une autre application utilisant le même nom de package, mais cela peut peut-être provoquer des erreurs étranges comme celle-ci.

EDIT: Je viens de voir cette page , ça me rappelle que j'ai déjà eu ce problème lors du téléchargement d'une application depuis le marché Android. L'application s'est bloquée au démarrage, j'ai essayé une beaucoup de fois mais j'ai toujours fini avec le même résultat. Ensuite, j'ai essayé de désinstaller l'application, de la réinstaller, et tout a bien fonctionné. Je l'utilise toujours aujourd'hui et le problème ne s'est plus jamais reproduit.

Sur mon lien, vous pouvez également voir qu'ils ont reproduit votre erreur en rendant l'application inaccessible (démonter SD), donc ce n'est certainement pas un problème avec votre code.

2
Dalmas

Cette erreur peut également se produire lorsque vous (au niveau du projet) importez incorrectement> Android> Existant Android Code dans l'espace de travail, via Eclipse. Dans mon cas, cette a abouti à un dossier "src" vide, mais j'ai remarqué un nouveau dossier commençant par "Java" à la racine et continuant avec le chemin du package (ie com/zyzcorp/...), menant au fichier MainActivity.Java.

Pour tester ce que je pensais pouvoir résoudre le problème, j'ai copié le fichier com. *. MainActivity.Java dans le dossier src, actualisé, nettoyé et redémarré Eclipse. J'ai pu créer et exécuter l'application sur l'appareil cible.

2
Tope Oluwole

J'ai résolu cela et j'ai pu localiser les causes: -Le manifeste sera corrompu. Même si la structure du package est correcte et que toutes les données ont été correctement écrites, l'activité ne sera pas trouvée. -R sera dans la structure du package qui a été déclarée pour la première fois avant de renommer. -Les configurations d'exécution sont installées avec le mauvais paquet de R. Donc l'activité est introuvable.

Ce que nous avons essayé: -Modifier manuellement les run-configs via l'exportation/import -Renommer manuellement la structure du package -Renommer manuellement la structure du package R -Supprimer la run-config (elle sera reconstruite si vous essayez de démarrer l'application) )

Solution: essayez de configurer un nouveau projet sans réutiliser votre manifeste. J'ai essayé de le réutiliser et j'ai de nouveau rencontré les mêmes problèmes. Donc, après la cause principale doit être le manifeste corrompu. J'espère que ça aide!

2
DublinCore

Il est peut-être trop tard pour résoudre votre problème, mais j'espère que cela aidera quelqu'un d'autre.
J'ai eu un problème similaire et après de nombreux essais, j'ai décidé de supprimer R.Java.
Cela a fait l'affaire.

2
Bbb

Vous avez renommé le package à tout moment? Cela se produit normalement si le package a été renommé après sa création. Le lien suivant devrait être utile dans ce cas http://code.google.com/p/Android/issues/detail?id=2824 . Si ce n'est pas le cas, veuillez publier votre fichier manifeste complet.

1
Tushar Vengurlekar

Je résout ce problème en supprimant le dossier "bin" et "gen" et en reconstruisant le projet.

1
Tadas Valaitis

J'avais juste un problème avec ça moi-même, donc je veux évoquer ce qui a causé le problème pour moi. Je venais d'inclure de nouvelles bibliothèques configurant des APK d'extension. Les bibliothèques dépendent les unes des autres et je n'en incluais qu'une seule dans mes propriétés> Android> bibliothèques.

Cela peut donc arriver si l'utilisateur n'a pas de bibliothèque sur son téléphone que la plupart des utilisateurs possèdent.

Il a montré ClassNotFoundException sur mon activité principale car il implémente une classe qui était dans la bibliothèque manquante.

1
AC Arcana

J'avais 5 packages différents. Et pour une raison quelconque, le compilateur recherchait l'activité sur le mauvais paquet.

J'ai donc basculé mon activité et toute la classe qui hérite de l'activité vers le package dans lequel elle se penchait.

J'ai obtenu le nom du package qu'il recherchait au début du logcat.

1
khadkara

J'ai eu le même problème que je l'ai résolu en décochant les dépendances Android du projet -> Propriétés -> Chemin du générateur Java -> Dépendances Android

1
Imran Khan

J'ai eu le même problème dans un récent projet Android. Le problème s'est avéré assez simple mais difficile à localiser. Cela m'est arrivé puis j'ai refactorisé le nom du package de l'activité du point d'entrée de l'application. Cela a créé un conflit avec le fichier gen /.../ R.Java, car le package n'a pas été refactorisé. Eclipse ne s'est pas plaint, mais au moment de l'exécution, j'ai eu la même erreur que vous avez publiée: impossible d'instancier .. . classNotFoundException ...

Leçon tirée de cela: faire NE PAS refactorisez le nom du package qui contient votre activité principale!

J'espère que cela vous aidera, vous ou quiconque, à se casser la tête sur cette erreur!

1
Warkst

J'ai le même problème mais cela l'a résolu. Dans mon androidmanifest.xml, j'avais cette ligne appelée Android: name = myappnameActivity. Bien que mon nom de classe ne soit que mon nom de domaine. Par conséquent, j'ai enlevé la partie activité dans le fichier xml et tout allait bien.

1
CodeGeek123

Je ne vois rien de mal à l'évidence. Tout ce que je peux dire, c'est d'essayer de le tester dans autant de configurations différentes que possible.

Testez-le dans l'émulateur pour chaque niveau de SDK possible, suivez les instructions de test sur écrans de tailles différentes (bien que cela ne semble pas être votre problème).

Essayez de le tester sur un téléphone de chacun des principaux fournisseurs, si vous pouvez trouver des amis qui en ont: HTC Sense, Motoblur, etc.

Si vous n'obtenez qu'un seul rapport, cela pourrait être quelque chose de compliqué avec cet appareil. Voyez si vous obtenez d'autres rapports similaires qui ajoutent plus de données.

1
Cheryl Simon

Supprimez les fichiers de dossier BIN et GEN. Reconstruire, tout devrait fonctionner. Vérifiez s'il y a une autre erreur en dessous de "incapable d'instancier", parfois une autre erreur se déclenche (l'activité ne peut pas se charger à cause de quelque chose même si sa classe a été trouvée.

0
sagits

Ce que je devais faire, c'est simplement refaire le processus de construction/exportation sans aucune modification du code. Cela a fonctionné pour moi, ce que j'ai fait en l'exportant deux fois. Lors de ma première exportation, le fichier APK de construction a une taille de fichier inférieure et la deuxième exportation (sans aucune modification du code/de la configuration) a produit une taille de fichier légèrement plus grande (environ 200 Ko de diff).

Ce bug dans la construction est vraiment coûteux, vous tue devant votre manager et devrait être vraiment corrigé par l'équipe Android/Eclipse. Sorte de suce

0
patrickjason91