web-dev-qa-db-fra.com

java.lang.ClassNotFoundException sur l'application de travail

J'ai créé et publié ma première Android. C'est très simple. Cela fonctionne très bien sur le simulateur et certains téléphones, mais je reçois cette erreur:

Java.lang.RuntimeException: Unable to instantiate application cz.teamnovak.droid.Novak ESC Track guide: Java.lang.ClassNotFoundException: cz.teamnovak.droid.Novak ESC Track guide in loader dalvik.system.PathClassLoader[/data/app/cz.teamnovak.droid-1.apk]
    at Android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.Java:649)
    at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4232)
    at Android.app.ActivityThread.access$3000(ActivityThread.Java:125)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2071)
    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:868)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:626)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.ClassNotFoundException: cz.teamnovak.droid.Novak ESC Track guide in loader dalvik.system.PathClassLoader[/data/app/cz.teamnovak.droid-1.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.newApplication(Instrumentation.Java:942)
    at Android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.Java:644)
    ... 11 more

Une idée de ce qui peut provoquer cela?

51
Skoky

Oui, j'ai eu exactement le même problème. C'est parce que j'ai spécifié le Android:name attribut dans le nœud d'application dans le fichier manifeste.

Votre fichier Android Manifest ressemble probablement à ceci:

   <application 
       Android:name="Novak ESC Track guide" 
       Android:icon="@drawable/icon" 
       Android:label="@string/app_name" 
       Android:description="@string/help_text" >

N'utilisez pas le Android:name attribut! sauf si vous avez implémenté un objet Application personnalisé.

Le application:name l'attribut n'a rien à voir avec le nom de votre application. Il s'agit du nom d'une classe spécifique à charger en tant qu'instance Application. C'est pourquoi vous obtiendrez le ClassNotFoundException si cette classe n'existait pas.

Pour le nom de l'application, utilisez le Android:label attribut à la place sur ce même noeud d'application.

Retirez-le et cela devrait fonctionner:

<application 
    Android:icon="@drawable/icon" 
    Android:label="@string/app_name" 
    Android:description="@string/help_text" >
40
phreakhead

Quelque chose comme ça s'est produit lorsque j'ai changé la cible de build en 3.2. Après avoir fouillé, j'ai découvert que avait nommé le dossier lib du pot "lib" au lieu de "libs". Je viens de le renommer en libs et de mettre à jour les références sur le chemin de construction Java et tout fonctionnait à nouveau. Peut-être que cela aidera quelqu'un ...

14
hobbs

Nous avons quelques projets où ce problème a été enregistré de temps en temps sur le marché Android. J'ai trouvé les problèmes suivants dans les manifestes:

  1. Si le nom du package est com.test, les noms des activités doivent être .ActivityName (avec un premier point), pas seulement ActivityName.

  2. Pour certaines classes, celles qui apparaissaient le plus souvent dans les journaux, le nom de la classe était spécifié comme com.test.Name alors qu'il aurait dû être .Name.

Je suppose que de nombreuses implémentations de Android traitent ces problèmes mineurs avec succès (c'est pourquoi l'exception ne s'est jamais produite lors des tests), tandis que d'autres rares lancent l'exception.

10
Alex

Eu la même erreur: Java.lang.RuntimeException: Impossible d'instancier l'activité (classnotfound) D'ABORD essayer de changer la plate-forme de construction (2.3.3 -> 2.2 -> 2.3.3) a fonctionné pour moi.

5
Mr G

Telle est mon observation concernant l'erreur. J'ai récemment mis à jour l'ADT vers 22.0.1. J'obtiens l'erreur suivante lorsque j'ai importé mes projets précédents "E/AndroidRuntime (24807): causée par: Java.lang.ClassNotFoundException: com.sherl.sherlockfragmentsapp.StartActivity dans le chargeur dalvik.system.PathClassLoader [/ data/app/com.sherl.sherlockfragmentsapp-1.apk] "

Ensuite, j'ai changé "Propriétés-> Chemin de génération Java-> Ordre et exportation" de la manière suivante [Impossible d'ajouter l'image en raison des règles du forum]

  1. Bibliothèques privées Android - cochée
  2. Android 4.2.2 - décoché
  3. Dépendances Android - cochée
  4. / src - sélectionné
  5. / gen - sélectionné

Cela a résolu le problème. J'espère que c'est vous aider les gars.

5
lakshman

J'ai eu ce genre de problème aujourd'hui après la mise à niveau vers le dernier ADT/SDK. Ça m'a pris un bon moment. Vérifié que j'ai utilisé google-apis (pour les cartes), uses-library, nettoyé le projet, etc.

Supprimer le projet et en ajouter un nouveau (créer un nouveau Android) l'a finalement résolu.

4
icyerasor

J'ai parfois ce problème avec Eclipse. Ce qui a corrigé cela pour moi, c'est d'aller dans les propriétés du projet/Android et de changer l'API cible de génération en une version différente et de republier. Je trouverai cela corrigé, puis je pourrai le changer à nouveau à la cible de construction souhaitée.

ou

Vous devrez peut-être vérifier votre proguard.cfg.

En supposant que vous avez correctement lié vos bibliothèques et que vos projets de bibliothèque contiennent le code dont vous avez besoin pour l'exportation, la prochaine étape que vous voudrez peut-être faire est de vérifier vos paramètres de proguard et de vous assurer que vous ne supprimez pas les classes dont vous avez besoin.

J'ai eu beaucoup de mal avec cela après que mon application ait travaillé directement sur l'émulateur ou le périphérique d'Eclipse. Le problème que je rencontrais était après que l'application a été publiée (c'est-à-dire passée par proguard) et exécutée sur l'appareil, il manquait des classes contenues dans le projet. Ils étaient en quelque sorte dépouillés.

Mon problème a peut-être été causé lorsque j'ai essayé d'utiliser IntelliJ et que je suis revenu à Eclipse.

Voici le fichier proguard qui a fonctionné pour moi:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends Android.app.Activity
-keep public class * extends Android.app.Application
-keep public class * extends Android.app.Service
-keep public class * extends Android.content.BroadcastReceiver
-keep public class * extends Android.content.ContentProvider
-keep public class * extends Android.app.backup.BackupAgentHelper
-keep public class * extends Android.preference.Preference
-keep public class com.Android.vending.licensing.ILicensingService

-keepclasseswithmembers class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(Android.content.Context, Android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(Android.content.Context, Android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}

-keep class * implements Android.os.Parcelable {
  public static final Android.os.Parcelable$Creator *;
}
4

J'ai eu cette erreur lorsque j'ai exécuté mon application sur des versions antérieures d'Android. Je pensais que SearchView était rétrocompatible avec Android 1.5, mais il a été créé en 3.0. J'ai supprimé sa référence du code et cela a fonctionné.

4
Logan

Je sais que cette question a été répondue, et ce n'était probablement pas le cas. Mais je recevais cette erreur et j'ai pensé que je posterais pourquoi au cas où cela pourrait être utile à quelqu'un d'autre.

J'obtenais donc cette erreur, et après plusieurs heures, je compris timidement que j'avais décoché "Projet> Construire automatiquement". Donc, même si je n'ai eu aucune erreur de compilation, c'est pourquoi j'obtenais cette erreur. Tout a commencé à fonctionner dès que j'ai réalisé que je ne construisais pas réellement le projet avant de déployer: - /

Voilà mon histoire :-)

4
Joel Martinez

Sois sûr que Android:hasCode n'est pas défini sur false dans votre fichier manifeste. C'est ce qui a résolu le problème pour moi!

3
lost_bits1110

Dans mon cas, j'ai dû ajouter Android:name=".activity.SkeletonAppActivity" au lieu de Android:name=".SkeletonAppActivity" dans le fichier manifeste de l'activité principale. SkeletonAppActivity était dans un package différent de la classe d'application. Bonne chance!

3
Tenesh

J'ai récemment investi du temps dans un rapport d'erreur similaire qui m'a atteint via les rapports d'erreur Play Store.

Un aperçu de certaines causes possibles.

Bibliothèque manquante

Puisque mon application est testée avant sa sortie et que le problème ne se produit qu'env. une fois par semaine, je suis sûr que le mien n'est pas un problème de bibliothèque. Vous devriez penser dans ce sens si une build sur votre système échoue et l'installation de l'application à l'aide d'ADB entraîne une erreur au lancement.

Le nettoyage et la construction de votre projet peuvent aider s'il s'agit d'un problème local et assurez-vous que vous disposez de la dernière version du SDK et de l'IDE.

Dans ces cas, c'est une classe de votre application ou une bibliothèque utilisée dans votre application qui déclenche l'erreur. Il s'agit d'une différence importante avec le point suivant où le point d'entrée (activité avec l'intention principale ou votre service personnalisé/objet d'application) de votre application n'est pas trouvé.

Si tel est le cas, consultez les questions et réponses suivantes que j'ai sélectionnées. Ils ont tous une réponse acceptée.

impossible d'instancier l'application - ClassNotFoundExceptionAndroid Activity ClassNotFoundException - a tout essayéAndroid ClassNotFoundException

Activité principale ou application introuvable

Mauvaise configuration d'AndroidManifest.xml

Plus comme une erreur de débutant a été citée ici auparavant dans l'une des réponses parlant du fichier manifeste Android.

Il est important que cette erreur empêche toujours le chargement de votre application. Il devrait cependant compiler mais planter lors de la première utilisation.

J'ai édité cette réponse, c'est la partie importante:

N'utilisez pas l'attribut Android: nom! sauf si vous avez implémenté un objet Application personnalisé.

L'attribut application: name n'a rien à voir avec le nom de votre application. Il s'agit du nom d'une classe spécifique à charger comme instance de votre application. C'est pourquoi vous obtiendriez l'exception ClassNotFoundException si cette classe n'existait pas.

Pour le nom de l'application, utilisez plutôt l'attribut Android: label sur ce même nœud d'application.

Supprimé: Java.io.IOException: impossible d'ouvrir le fichier DEX

Maintenant ça devient intéressant! Cela faisait partie de la trace de pile enregistrée dans mon cas via le Playstore. Je peux donc créer une build et l'exécuter sur mon appareil sans erreur (alors que toutes les erreurs précédentes empêcheraient toute exécution).

Un commentaire important a été fait à la SO question Application Android ClassNotFoundException, Impossible d'instancier l'application

Il semble que le système ait du mal à ouvrir votre fichier dex d'application Java.io.IOException: impossible d'ouvrir le fichier DEX, c'est avant que vos classes ne soient chargées, donc cela n'a rien à voir avec la façon dont vous définissez votre classe d'application dans le Manifeste. - user2046264 27 février 14 à 2:25

La partie importante ici est l'exception IOException supprimée. Cela indique qu'une opération IO a échoué. Des exemples d'opérations IO sont des appels réseau et de stockage.

Un autre rapport d'erreur qui va dans ce sens est répertorié dans Android to Unable to instiate Application Java.lang.ClassNotFoundException: où le rôle du stockage externe fourni par une carte SD est mentionné.

Certaines autres questions similaires indiquent que cela peut être une erreur de l'utilisateur. "/ mnt/asec/..." indique que l'application s'exécute à partir de la carte SD. Si la carte SD est retirée, cela pourrait provoquer cette erreur. Les applications tierces ou les appareils rootés peuvent probablement déplacer une application vers la carte SD même si elle n'est pas autorisée par le manifeste.

Si vous êtes désespéré, lisez toutes les réponses à cette question, car il existe également d'autres chemins. Pensez à la spécification complète du package, à l'utilisation de singletons et plus encore.

Le point ici est que le réseau et le stockage sont des E/S.

Pour mon cas spécifique, j'ai vérifié tous les appareils qui ont signalé cette erreur et constaté qu'ils ont tous un support de stockage externe. Ainsi, un utilisateur peut installer l'application et la déplacer vers un stockage externe, retirer la carte SD et obtenir cette erreur (juste une théorie, non testée).

Pour plus d'informations sur les options installLocation, voir http://developer.Android.com/guide/topics/data/install-location.html

J'ai également considéré le réseau. En plus de la page de détail de trace de pile dans les rapports Play Store, vous obtenez un aperçu des occurrences de l'erreur au fil du temps.

Il m'a semblé que l'erreur s'est produite plus au moment où une mise à jour a été publiée. Cela pourrait soutenir la théorie selon laquelle l'utilisateur obtient une mise à jour de l'application, télécharge cette mise à jour qui est en quelque sorte corrompue. L'installation se passe bien mais la première exécution de l'application entraîne l'erreur (là encore juste une théorie, non testée).

Autres ressources

Enfin 2 ressources non SO qui pourraient vous aider:

https://groups.google.com/forum/#!topic/Android-developers/JC7_qqwBRjohttps://code.google.com/p/Android/issues/detail? id = 72121

2
hcpl

Dans mon cas, le icône de l'application était à l'origine de l'erreur:

<application
    Android:name="com.test.MyApp"
    Android:icon="@drawable/myicon"

Pourquoi? Parce que je mets l'icône uniquement dans le dossier "drawable", et j'utilise un appareil de test haute résolution, donc elle cherche dans l'icône "drawable-hdpi" pour l'icône. Le comportement par défaut pour tout le reste est d'utiliser les icônes de "drawable" si elles ne sont pas dans "drawable-hdpi". Mais pour l'icône de lancement, cela ne semble pas être valide.

La solution consiste donc à mettre une copie de l'icône (avec le même nom, bien sûr) dans "drawable-hdpi" (ou selon les résolutions prises en charge par les appareils).

2
Ixx

Eh bien, vous avez une exception Java.lang.ClassNotFoundException. Cela signifie qu'une classe manque dans l'exécution de l'application. Vous devez vérifier si vous avez ajouté toutes vos bibliothèques au chemin de génération.

Faites un clic droit sur votre projet -> propriétés -> Java chemin de génération -> bibliothèques, ajoutez vos bibliothèques ou créez-en une contenant vos classes et activez l'exportation des commandes pour vos bibliothèques.

2
Artjom Zabelin

J'ai utilisé une méthode de supertype qui a été déclarée "finale" dans l'une de mes activités (en particulier la méthode "isResumed ()"). L'erreur réelle n'a été affichée dans LogCat qu'après le redémarrage de mon périphérique de développement.

2
Rich Ehmer

L'erreur Class Not Found indique que vos fichiers de classe sont manquants. Veuillez aller à Propriétés> Java Build Path et ajoutez votre package contenant vos fichiers Java aux Source = tab s'il est trouvé manquant. Générez ensuite votre projet. Cela créera les fichiers .class manquants.

2
rino

J'ai le même problème dans Android os version 4.1.2

ajoutez la ligne ci-dessous à votre AndroidManifest.xml au dessous de Android:label="@string/app_name" dans la balise d'application

Android:name="Android.support.multidex.MultiDexApplication"

Cela peut aider quelqu'un avec le même problème.

0
CLIFFORD P Y

Vérifiez si le nom du package dans la classe correspond au nom du package dans le fichier manifeste. Cela a fonctionné pour moi

0
Droidme

Définir minifyEnabled sur false dans mon build.gradle file a résolu le problème pour moi.

release {
    minifyEnabled false
}
0
Chris Stillwell

Pour moi, c'était juste pour nettoyer le projet.

J'ai nettoyé le projet et j'ai recommencé. Et toutes les erreurs ont disparu.

0
Khemraj

J'ai eu une exception ClassNotFoundException pointant vers ma classe Application.

J'ai trouvé que j'avais manqué Java builder dans mon . Projet

Si quelque chose manque dans votre buildSpec , fermez Eclipse, assurez-vous que tout est en place et redémarrez Eclipse

        <buildSpec>
            <buildCommand>
                    <name>com.Android.ide.Eclipse.adt.ResourceManagerBuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
            <buildCommand>
                    <name>com.Android.ide.Eclipse.adt.PreCompilerBuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
            <buildCommand>
                    <name>org.Eclipse.jdt.core.javabuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
            <buildCommand>
                    <name>com.Android.ide.Eclipse.adt.ApkBuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
    </buildSpec>
0
Yaroslav Mytkalyk

Dans mon cas, cela se produit lorsque j'ai déplacé mon activité de lanceur vers un package différent sans mettre à jour le fichier manifeste.

0
Kishore

Utilisez-vous votre code dans différents environnements, disons, en utilisant Dropbox ou quelque chose comme ça? Utilisez-vous une bibliothèque ou similaire? J'ai eu beaucoup de problèmes après avoir partagé les fichiers de l'espace de travail et je l'ai corrigé en reconfigurant les dépendances. J'espère que ça aide quelqu'un!

0
Dani bISHOP