Question ClassNotFoundException: n'a pas trouvé la classe sur le chemin: DexPathList


J'ai un problème depuis que j'ai mis à jour mon application sur Playstore. Depuis cette mise à jour, l'exception est levée, mais je n'ai rien changé concernant cette exception.

Trace de la pile:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.opiatefuchs.onthejobtimerlight/de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity}: java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity" on path: DexPathList[[zip file "/data/app/de.opiatefuchs.onthejobtimerlight-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
... 10 more
Suppressed: java.lang.ClassNotFoundException: de.opiatefuchs.onthejobtimerlight.OnTheJobTimerActivity
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

Le truc, c’est que la version de mon application s’exécute sans problème et je n’ai rien changé à cette activité. Je viens d'ajouter un nouveau dialogue d'information qui n'a rien à voir avec cette activité. Cette application est une version gratuite, j'ai fait exactement les mêmes modifications sur la version pro et rien n'est jeté. Cela fonctionne comme prévu. La seule différence entre Pro et Lite est que j'ai intégré Admob (sur le nouveau mode) dans la version allégée et la licence Google Play dans la version pro. Mais je l'ai intégré depuis le début et je n'ai pas apporté de modifications à cela. Je n'ai pas non plus apporté de modifications au manifeste, j'ai lu de nombreux articles ici, mais rien ne m'aide.

Il semble que cela se produise sur les versions Android depuis la version 5.0. Quelqu'un at-il une idée de ce que ce problème pourrait causer ou quelqu'un a-t-il les mêmes expériences? Est-il possible que proguard ait tout détruit en obscurcissant (également ici, pas de changement)?

Je n'ai posté aucun code, car ce n'est pas important pour ce problème, comme je l'ai dit, je n'ai pas apporté de modifications liées à cette exception.

Cette question est marquée comme étant en double mais elle ne l'est pas. Le commentaire avec le lien ne résout pas mon problème, toutes les bibliothèques sont vérifiées et intégrées correctement. De plus, je n'utilise pas NDK.


28
2018-04-23 07:37


origine


Réponses:


Mettre à jour

Après un long moment, il s'est avéré que cela devait avoir quelque chose à voir avec proguard. Je ne peux pas vraiment dire ce que l'erreur provoque exactement, mais j'ai essayé un peu et c'est ce que j'ai remarqué (c'est dans mon cas avec Eclipse IDE):

  • Je dois fermer tous les onglets du projet que je veux signer
  • Je dois nettoyer le projet et après le nettoyage, ne rien faire d'autre qu'exporter l'apk
  • faire un petit changement dans le manifeste, l'enregistrer et annuler la modification (et enregistrer)
  • S'il y a une classe dans le manifeste nommé avec "YourClass" ou ".YourClass", changez-la en "com.yourpackage.yourClass"

Ce sont les quatre points que j'ai faits et ensuite cela a fonctionné. Cela semble suspect, mais je pense qu’il ya un problème avec l’obscurcissement. Parce que sans faire ces points, je peux simplement compiler mon apk et l'installer depuis eclipse. Pour moi, il n'y a pas de raison évidente pour ce comportement. De plus, le nom du paquet ne fonctionne pas sans modification si je l’installe uniquement depuis eclipse. J'espère que ces points peuvent aider quelqu'un.


25
2018-05-06 11:53



Si vous manifestez le nom du paquet est ok, Si vous avez cloué le projet,  et dans l'explorateur de fichiers renommé votre projet mais après en avoir importé un, vous rencontrez à nouveau ce problème la seule façon ici est de

SUPPRIMER CE DOSSIER .gradle.

Celui-ci peut être trouvé dans le dossier du projet en utilisant l'explorateur de fichiers. Il contient des fichiers d'artefacts contenant le nom de cet ancien projet. Après avoir rouvert le projet dans Android Studio, le dossier sera recréé automatiquement.


14
2018-06-23 14:46



Je viens de changer mon titre de com.android.tools.build:gradle:2.2.2 à com.android.tools.build:gradle:2.2.0, et le problème est bien!


8
2018-02-15 02:28



Pour moi, cela s'est produit lorsque le nom du paquet (nom du répertoire) a été modifié.

J'ai réalisé que le dossier "build" conserve comme par magie les fichiers intermédiaires pour la construction du projet. J'ai supprimé le dossier "build" sous le dossier "app". Maintenant, le gradle devait refaire tous les fichiers avec le nouveau nom du paquet. Maintenant, il fonctionne correctement.


4
2018-05-16 11:16



Je pense que cela a quelque chose à voir avec les noms de paquets multiples et multidex si vous avez plusieurs modules. Nettoyez le projet et supprimez tous les builds / dossiers.


3
2017-07-24 19:29



tl; dr: Cela semble être dû au mélange des déclarations relatives et absolues dans AndroidManifest.xml. Je pense que la meilleure solution consiste à utiliser une notation relative lors de la déclaration <application .../>, <activity .../>, <receiver .../>, et <service .../>est dans votre AndroidManifest.xml.

Explication complète:

J'ai eu ce problème pour trop longtemps, c'était parce que j'utilisais à la fois absolu et relatif <application .../>, <activity .../>, <receiver .../>, et <service .../> déclarations dans mon AndroidManifest.xml. Voici ce que j'ai fait pour le réparer:

En toi AndroidManifest.xml assurez-vous que le <manifest .../> la section a package: propriété spécifiée correctement, il devra être le chemin absolu exact, comme ceci:

<manifest
    package="com.my.absolute.package.path"
    xmlns:android="http://schemas.android.com/apk/res/android">...</manifest>

Maintenant que vous avez le chemin absolu correct spécifié dans votre <manifest .../> section, vous devrez utiliser un chemin relatif pour tous <application .../>, <activity .../>, <receiver .../>, et <service .../>est défini dans votre AndroidManifest.xml.

Exemples:

<application
    android:name=".BaseApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity
        android:name=".activity.SomeActivity"
        android:configChanges="orientation"
        android:label="@string/app_name"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.ParentActivity"/>
    </activity>

    <activity
        android:name=".activity.MyActivity"
        android:configChanges="orientation"
        android:label="@string/app_name"
        android:parentActivityName=".activity.ParentActivity"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme"
        />

    <receiver
        android:name=".receivers.MyReceiver"
        android:enabled="true"
        android:exported="false">
    </receiver>

    <service
        android:name=".services.MyService"
        android:enabled="true"
        android:exported="false"
        />
</application>

Bien sûr, assurez-vous également de nettoyer votre projet.


2
2018-05-19 00:38



Parfois, lorsque nous générons un fichier apk signé, si nous avons un problème de bibliothèque de dépendances (bibliothèque jar en double), cette erreur peut survenir. Veuillez vérifier le chemin de génération et supprimer la bibliothèque en double, et vérifiez si une bibliothèque n'est pas cochée à partir de l'onglet commande et export.


1
2018-04-23 09:30



J'obtenais une erreur similaire. j'ai la solution ici.

Si votre fichier manifeste n'est pas correct, suivez alors ce


1
2017-07-18 07:28



La raison est, android pas capable de trouver l'activité spécifique dans le dexpath.

Nous devrions donc fournir l'intégralité du chemin des activités dans "Fichier manifeste".

Par exemple, le nom de votre activité est "SplashActivity" et il se trouve dans "com.packagename.package". Nous devrions donc fournir le nom complet du package de cette activité.

com.packagename.package.SplashActivity

1
2017-11-21 14:46



J'ai eu un problème similaire, voici ma solution:

  1. Remplacez le nom de l'application dans AndroidManifest par le chemin d'accès complet
  2. Projet propre
  3. Projet de reconstruction
  4. Construire APK

0
2018-04-09 22:46