3 votes

Le remaniement du nom du paquet interrompt l'application avec une ClassNotFoundException, car la classe Application n'est pas trouvée alors qu'elle existe.

I tenía ce format de paquet :

com
  example
    name
      oldAppName

Maintenant que j'ai refactorisé et renommé par Shift+F6 en ceci :

com
  myCompanyName
    name
      newAppName

Cependant, maintenant, lorsque je lance mon application, j'obtiens cette panne :

java.lang.ClassNotFoundException: Didn't find class "com.example.name.oldAppName.Application" on path: DexPathList[[zip file "/data/app/com.myCompanyName.name.newAppName1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

J'ai mon Application.java sous newAppName et il est défini correctement dans le manifeste J'ai essayé et fait ce qui suit :

  • Nettoyage et reconstruction
  • Changer applicationId dans build.gradle
  • Le nom du paquet dans le manifeste est correct, de même que tous les noms de l'application et des activités.

En fait, voici la balise de mon manifeste d'application :

<application
  android:name=".Application"
  ...
  >

Même en changeant .Application au nom complet du paquet ( com.blah.blah.Application ) ÇA N'A PAS MARCHÉ.

Est-ce que j'ai manqué quelque chose ? Y a-t-il une étape manquante ?

Voici le journal complet :

    java.lang.RuntimeException: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication: java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
      at android.app.LoadedApk.makeApplication(LoadedApk.java:516)
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345)
      at android.app.ActivityThread.access$1500(ActivityThread.java:135)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:136)
      at android.app.ActivityThread.main(ActivityThread.java:5045)
      at java.lang.reflect.Method.invokeNative(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:515)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
      at dalvik.system.NativeStart.main(Native Method)
   Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
      at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:220)
      at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239)
      at android.app.Application.attach(Application.java:181)
      at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
      at android.app.Instrumentation.newApplication(Instrumentation.java:992)
      at android.app.LoadedApk.makeApplication(LoadedApk.java:511)
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345) 
      at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5045) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 
   Caused by: java.lang.ClassNotFoundException: com.example.name.oldAppName.Application
      at java.lang.Class.classForName(Native Method)
      at java.lang.Class.forName(Class.java:251)
      at java.lang.Class.forName(Class.java:216)
      at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209)
      at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239) 
      at android.app.Application.attach(Application.java:181) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:1008) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:992) 
      at android.app.LoadedApk.makeApplication(LoadedApk.java:511) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345) 
      at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5045) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 
   Caused by: java.lang.NoClassDefFoundError: com.example.name.oldAppName/Application
      at java.lang.Class.classForName(Native Method) 
      at java.lang.Class.forName(Class.java:251) 
      at java.lang.Class.forName(Class.java:216) 
      at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209) 
      at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239) 
      at android.app.Application.attach(Application.java:181) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:1008) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:992) 
      at android.app.LoadedApk.makeApplication(LoadedApk.java:511) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345) 
      at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5045) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 
   Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.name.oldAppName.Application" on path: DexPathList[[zip file "/data/app/com.newCompanyName.name.newAppName-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.myCompanyName.name.newAppName-1, /system/lib]]
      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
      at java.lang.Class.classForName(Native Method) 
      at java.lang.Class.forName(Class.java:251) 
      at java.lang.Class.forName(Class.java:216) 
      at com.android.tools.fd.runtime.BootstrapApplication.createRealApplication(BootstrapApplication.java:209) 
      at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:239) 
      at android.app.Application.attach(Application.java:181) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:1008) 
      at android.app.Instrumentation.newApplication(Instrumentation.java:992) 
      at android.app.LoadedApk.makeApplication(LoadedApk.java:511) 
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4345) 
      at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5045) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method)

6voto

Vijai Points 484

Parfois, désactivation de l'exécution instantanée résoudra le problème.

Ou, si la désactivation de l'exécution instantanée n'a pas fonctionné le problème pourrait venir du fait qu'Android Studio ne reconnaît pas encore les changements. SAUVEGARDEZ D'ABORD VOTRE PROJET et notez que vous devrez reconfigurer votre VCS après cela (mais aucun commits ou branches ne seront perdus, juste l'enregistrement de votre VCS).

Supprimez les fichiers .idea et [yourProjectName].iml de votre application.


Pour les futurs utilisateurs :


La bonne façon de renommer les paquets dans Android Studio

  1. Dans votre volet Projet, choisissez l'icône d'engrenage
  2. Décochez " Paquets compacts de milieux vides " si elle est vérifiée.

Gear icon example

  1. Maintenant, continuez avec refactor->renommer pour chaque nom de paquet décomposé (essentiellement com, example, name, oldAppName)
  2. Renommer peut ouvrir une boîte de dialogue dans laquelle vous devez choisir entre les options suivantes Renommer le paquet

Warning dialog example

  1. Une fois le renommage du paquet effectué, remplacez applicationId dans gradle avec le bon

  2. Sync gradle

  3. nettoyer et reconstruire

Vous pouvez trouver une meilleure version de la façon de refactoriser correctement votre paquet. aquí

P.S : vous devez revenir au nom du paquet original au point où vous n'avez pas obtenu l'exception "ClassNotFound" et essayer la solution ci-dessus.

3voto

Matt Points 5550

Pour ceux qui viennent ici, dans au moins la version 2.2.3 du plugin Android Gradle, il y a un bug de mise en cache agressive d'un artefact utilisé par l'exécution instantanée pour récupérer l'id et la classe de votre application. Vous pouvez contourner le problème en faisant rm -rf ~/.android/build-cache et ensuite faire une reconstruction propre puis lancer votre application.

Il y a un moyen de limiter la suppression en faisant find ~/.android/build-cache -type f | xargs grep -l AppInfo et en supprimant uniquement les dossiers de cache correspondants :

$ find ~/.android/build-cache -type f | xargs grep -l AppInfo
/Users/joe/.android/build-cache/dde3e201178401491cae141d479a0b4113bf3a0e/output/classes.dex
/Users/joe/.android/build-cache/f7d636c8af71d68edfb468297d20157f3eb6659c/output/classes.dex

$ rm -rf /Users/joe/.android/build-cache/dde3e201178401491cae141d479a0b4113bf3a0e
$ rm -rf /Users/joe/.android/build-cache/f7d636c8af71d68edfb468297d20157f3eb6659c

Cela résoudra le problème jusqu'au prochain renommage de l'id/package de l'application.

Voir les détails ici code.google.com/p/Android/issues/detail?id=229128#c8

0voto

Krishna Points 19

J'ai rencontré un problème similaire après le remaniement d'une de mes classes java, et je l'ai résolu en nettoyant la structure du projet.

  1. Aller à Build
  2. Cliquez sur l'option de nettoyage du projet

Après cela, tout a été résolu.

0voto

lonelearner Points 63

Avant d'effectuer une construction propre, vérifiez les points suivants pour vous assurer que tous les éléments suivants ont été mis à jour avec le nouveau nom de classe.

  1. nom de la classe sur le répertoire : MainActivity
  2. classe : public class MainActivity extends ....
  3. Manifeste :
  4. XML : tools:context=".MainActivity" (en anglais)

Après quoi, vous faites une construction/reconstruction propre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X