Android: impossible d’instancier activity / ClassNotFoundException

J’ai récemment publié une application sur le marché et je reçois maintenant une erreur de la part de certains utilisateurs. L’application se bloque probablement dès le 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: J’imagine 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 stacktrace mais il n’y a pas d’informations sur la configuration, l’appareil, la version Android, etc.

L’application est une simple table d’harmonie, donc il n’y a vraiment pas de magie, mais je ne comprends pas pourquoi cela échoue sur certains téléphones. Voici la trace de la stack que j’obtiens, j’espère que tout le monde 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 

Ce sont 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 (presque) complet onCreate:

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

              

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.
  • Le ContentView est défini avant d’accéder aux éléments de la vue.

Je sais qu’il est difficile de déterminer la source d’une erreur sans pouvoir la reproduire, mais peut-être que quelqu’un a une idée shinye 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 où elle est? (Oui, selon Mayra)

EDIT: La question principale qui rest maintenant est la suivante: comment se fait-il que le chemin dans PathClassLoader soit différent de mon nom de paquet? 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

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

J’ai résolu ce problème en sélectionnant: Project-> properties-> order and export

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

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é sur la carte SD dans le réglage de l’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 sur la nouvelle carte (avec cp -a), puis inséré la nouvelle carte et redémarré le périphérique. Tout semble fonctionner comme prévu, mais je vois maintenant que toutes les applications de la carte SD se bloquent avec la même erreur.

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

Donc, je dirais que ceci est un bug Android et non quelque chose qui peut être corrigé par les développeurs d’applications.

Voir aussi: http://android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html

Lorsque vous échangez des cartes SD sur un appareil Android, il a toujours été le cas. Si vous copiez physiquement le contenu de l’ancienne carte sur le nouveau, le système utilisera les données de la nouvelle carte comme si rien n’avait changé. Cela est également vrai pour les applications installées sur la carte SD. ”

Cela semble être incorrect.

Cela m’est arrivé quand j’ai refait un de mes noms de paquets et que l’outil de refactor a supprimé le premier “.” de tous mes noms d’activité. donc dans le AndroidManifest.xml, je devais changer Android: name = “MyActivity” à Android: name = “. MyActivity”

J’espère que cela aide quelqu’un, je viens de perdre beaucoup de temps o

Cela ne s’applique pas à la question de l’OP, mais à la mienne et il m’a fallu un certain temps pour la comprendre: lorsque vous utilisez l’API Google Maps, assurez-vous d’avoir inclus la déclaration de la 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 :

          

Je ne sais pas pourquoi le chemin d’access dans PathClassLoader est différent de celui de votre paquet mais lorsque vous testez l’émulateur, essayez de forcer la fermeture puis exécutez-le à nouveau, comme indiqué dans ce lien.

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

  • J’ai créé un projet avec un package appelé “myapp.sound” contenant l’activité. Le programme a fonctionné normalement;
  • J’ai renommé ce paquet 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 semble que le “changeur de nom de paquet” d’Eclipse ne met pas à jour toutes les dépendances. Si ce n’est pas ssortingctement 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 toute votre classe Java.

Examinez le package défini en haut du fichier de gestion et assurez-vous qu’il correspond au package dans lequel la classe est définie.

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

Également, 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 la construction.

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

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.

J’étais confronté à ce problème lorsque j’inclus java projects dans mon chemin de construction pour mon projet Android ciblant JavaSE-1.7.

Pour une raison quelconque, mon émulateur ne lançait pas une classe introuvable 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 JRE n’est installé dans l’espace de travail qui soit ssortingctement compatible avec cet environnement.” Mais l’émulateur Android se lancerait et je n’aurais pas une exception classnotfoundexception

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

Bonne chance!

Semblable à Bobf Cali, j’ai d’abord vu cette erreur après avoir renommé mon paquet 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.

Notez qu’en fonction de la version du plugin eclipse android que vous utilisez (le cas échéant), vous devrez peut-être également mettre à jour les noms des activités dans votre fichier AndroidManifest.xml.

Vu le même message d’erreur après 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é.

Êtes-vous sûr que le nom de votre paquet est unique? Je ne sais pas ce qui se passe si l’utilisateur dispose d’une autre application utilisant le même nom de package, mais cela peut entraîner des erreurs étranges.

EDIT: Je viens de voir cette page , elle me rappelle que j’avais déjà ce problème lors du téléchargement d’une application sur le marché Android. L’application s’est écrasée au démarrage, j’ai essayé beaucoup de fois mais j’ai toujours terminé avec le même résultat. Ensuite, j’ai essayé de désinstaller l’application, de le réinstaller et tout s’est bien passé. Je l’utilise encore aujourd’hui et le problème ne s’est 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.

Consultez cet article: http://www.androidguys.com/2010/05/22/storing-apps-sd-froyo/ qui explique les limites du stockage des applications sur les 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 (la tentative de perja de corriger) car cela pourrait changer la propriété des fichiers de telle sorte que l’ID utilisateur de l’application et la propriété des fichiers ne correspondent plus.

J’ai résolu ce problème et j’ai pu localiser les causes: – Le manifeste sera corrompu. Même si la structure du paquet est correcte et que chaque donnée est correctement écrite, l’activité ne sera pas trouvée. -R sera dans la structure de paquet qui a été déclarée pour la première fois avant de renommer. -Les configurations d’exécution sont configurées avec le mauvais paquet de R. L’activité est donc introuvable.

Ce que nous avons essayé de: – Modifier manuellement les run-configs via export / import – Renommer manuellement la structure de package – Renommer manuellement la structure de package R – Supprimer le fichier de configuration (il sera reconstruit 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 eu à nouveau les mêmes problèmes. Donc après la cause principale doit être le manifeste corrompu. J’espère que ça aide!

Assurez-vous que votre répertoire / src est répertorié dans vos projets> propriétés> chemin de compilation java> source

Peut-être qu’il est 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 plusieurs essais, j’ai décidé de supprimer R.java.
Cela a fait l’affaire.

Cette erreur peut également se produire lorsque vous (au niveau du projet) importez de manière incorrecte> Android> du code Android existant dans Workspace, via Eclipse. Dans mon cas, cela 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 paquet (par exemple com / zyzcorp / …) menant à MainActivity. fichier 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 le périphérique cible.

Je ne vois rien de manifestement faux. 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 pour effectuer des tests sur des é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, il se peut que ce soit quelque chose de vicieux avec cet appareil. Voir si vous obtenez d’autres rapports similaires qui ajoutent plus de données.

Vous avez renommé le package à tout moment? Cela se produit normalement si le paquet 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 de manifeste complet.

J’ai eu le même problème dans un projet Android récent. Le problème s’est révélé assez simple mais difficile à localiser. Cela m’est arrivé alors j’ai refait le nom du paquet de l’activité du point d’entrée de l’application. Cela a créé un conflit avec le fichier gen /…/ R.java, car le paquet n’a pas été refactoré. Eclipse ne s’est pas plaint, mais à l’exécution, j’ai eu la même erreur que vous avez posté: impossible d’instancier … classNotFoundException …

Leçon tirée de ceci: NE PAS refactoriser le nom du paquet qui détient votre activité principale!

J’espère que cela vous aide ou quiconque se casse la tête à cause de cette erreur!

J’ai le même problème mais cela a résolu le problème. Dans mon androidmanifest.xml, j’avais cette ligne appelée Android: name = myappnameActivity. Bien que mon nom de classe ne soit que myappname. J’ai donc retiré la partie Activité du fichier xml et tout allait bien.

J’avais juste un problème avec moi-même, alors je veux évoquer ce qui a causé le problème pour moi. Je venais d’inclure quelques nouvelles bibliothèques mettant en place des APK d’extension. Les bibliothèques dépendent les unes des autres et je n’incluais que l’une d’entre elles dans mes bibliothèques> android> properties.

Cela peut donc se produire si l’utilisateur ne dispose pas d’une bibliothèque sur son téléphone.

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

J’ai eu 5 paquets différents. Et pour une raison quelconque, le compilateur recherchait l’activité sur le mauvais package.

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

J’ai eu le nom du paquet qu’il cherchait au début du logcat.

Je résous ce problème en supprimant les dossiers “bin” et “gen” et en reconstruisant le projet.

J’ai eu le même problème que j’ai résolu en décochant les dépendances Android du projet -> Propriétés -> Java Builder Path -> dépendances Android

Supprimer les fichiers de dossier BIN et GEN. Reconstruire, tout devrait fonctionner. Vérifiez si theres une autre erreur sous le “impossible à instancier”, parfois une autre erreur déclenche ceci (activité ne peut pas charger à cause de quelque chose même si sa classe a été trouvée.

Il ne me rest plus qu’à refaire le processus de construction / exportation sans aucune modification du code. Cela a fonctionné pour moi, ce que j’ai fait était de l’exporter deux fois. Lors de ma première exportation, la taille de fichier APK 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 supérieure (environ 200 Ko de diff).

Ce bug dans la construction est très coûteux, vous tue devant votre manager et devrait être vraiment corrigé par l’équipe d’Android / Eclipse. Genre de suce

J’ai récemment acheté une nouvelle tablette pour le développement uniquement avec Android 4.0. Il n’avait pas de carte SD externe. Le programme de démonstration que je exécutais tomberait en panne avec la même erreur. Il avait la même ligne dans le manifeste demandant l’autorisation SD:

  

Après avoir installé une carte SD externe, le problème a disparu. Il est possible que la personne ne possède pas de carte SD et que votre logiciel ne la gère pas correctement. Mon programme de démonstration ne vérifie pas l’existence d’une carte SD. Voici un lien de stackflow décrivant le problème:

Développement Android – testez la carte SD ou supposez qu’elle existe?

Je me rends compte que je suis en retard à la fête, mais cela peut aider quelqu’un d’autre.