wake-up-neo.com

ClassNotFoundException: Klasse im Pfad nicht gefunden: DexPathList

Ich habe ein Problem, seit ich meine App im Playstore aktualisiert habe. Seit diesem Update wird die Ausnahme ausgelöst, aber ich habe nichts an dieser Ausnahme geändert.

Stacktrace:

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

Die Sache ist, meine App-Version läuft ohne Probleme und ich habe nichts an dieser Aktivität geändert. Ich habe gerade einen neuen Info-Dialog hinzugefügt, der nichts mit dieser Aktivität zu tun hat. Diese App ist eine kostenlose Lite-Version. Ich habe genau die gleichen Änderungen an der Pro-Version vorgenommen und dort wird nichts geworfen. Das funktioniert wie erwartet. Der einzige Unterschied zwischen Pro und Lite ist, dass ich Admob (auf dem neuen Weg) in die Lite-Version und die Google Play-Lizenz in die Pro-Version integriert habe. Aber das habe ich von Anfang an integriert und habe daran nichts geändert. Ich habe auch keine Änderungen am Manifest vorgenommen, ich lese hier viele Beiträge, aber nichts hilft. 

Es scheint, dass es auf Android-Versionen seit 5.0 gerade passiert. Hat jemand eine Idee, was dieses Problem verursachen könnte, oder hat jemand dieselben Erfahrungen? Ist es möglich, dass der Proguard irgendetwas durch Verschleiern zerstört hat (auch hier keine Änderungen)?

Ich habe keinen Code gepostet, da es für dieses Problem nicht wichtig ist. Ich sagte, ich habe keine Änderungen bezüglich dieser Ausnahme vorgenommen.

Diese Frage wird als doppelt markiert, ist es aber nicht. Der Kommentar mit dem Link behebt mein Problem nicht, alle Bibliotheken werden geprüft und auf die richtige Weise integriert. Ich benutze auch kein NDK.

28
Opiatefuchs

Aktualisieren

Nach langer Zeit stellte sich heraus, dass es etwas mit Proguard zu tun haben muss. Ich kann nicht wirklich sagen, was genau der Fehler verursacht, aber ich habe es ein bisschen ausprobiert und das ist mir aufgefallen (das ist in meinem Fall bei der Eclipse-IDE):

  • Ich muss jeden Tab aus dem Projekt schließen, das ich unterschreiben möchte
  • Ich muss das Projekt reinigen und nach der Reinigung nichts anderes tun, als den apk zu exportieren
  • eine kleine Änderung im Manifest vornehmen, speichern und die Änderung rückgängig machen (und speichern)
  • wenn im Manifest eine Klasse mit "YourClass" oder ".YourClass" benannt ist, ändern Sie sie in "com.yourpackage.yourClass".

Das sind die vier Punkte, die ich gemacht habe, und dann hat es funktioniert. Das sieht verdächtig aus, aber ich denke, es gibt ein Problem mit der Verschleierung. Ohne diese Punkte kann ich einfach mein apk kompilieren und von Eclipse installieren. Für mich gibt es keinen offensichtlichen Grund für dieses Verhalten. Auch der Paketname funktioniert ohne Änderung, wenn ich ihn nur von Eclipse aus installiere. Ich hoffe, diese Punkte können jemandem helfen.

26
Opiatefuchs

Wenn Sie den Paketnamen manifestieren, ist Wenn Sie das Projekt überschrieben haben, und innerhalb des Datei-Explorers hat Ihr Projekt umbenannt Nach dem Importieren eines Projekts tritt dieses Problem erneut auf. __ 

LÖSCHEN SIE DIESEN ORDNER .gradle

Dieser befindet sich im Projektordner mithilfe des Datei-Explorers ..__ und enthält Artefaktdateien, die den Namen des alten Projekts enthalten . Nach dem erneuten Öffnen des Projekts in Android Studio wird der Ordner automatisch neu erstellt.

14
CodeToLife

Ich habe gerade mein gradle von com.Android.tools.build:gradle: 2.2.2 in com.Android.tools.build:gradle: 2.2.0 geändert.

8
林志文

Für mich ist es passiert, wenn der Paketname (Verzeichnisname) geändert wurde.

Mir wurde klar, dass der "build" -Ordner Zwischendateien für den Projektaufbau magisch verwaltet. Ich habe den Ordner "build" im Ordner "app" gelöscht . Nun musste der Absolvent alle Dateien mit dem neuen Paketnamen neu erstellen. Jetzt funktioniert es richtig.

4
HBB20

Ich denke, es hat etwas mit multidex und mehreren Paketnamen zu tun, wenn Sie mehrere Module haben. Bereinigen Sie das Projekt und löschen Sie alle Builds/Ordner.

3
Ozzz

tl; dr: Dies scheint auf die Mischung von relativer und absoluter Deklaration im AndroidManifest.xml zurückzuführen zu sein. Ich denke, die beste Lösung ist die Verwendung der relativen Notation, wenn Sie <application .../>, <activity .../>, <receiver .../> und <service .../> in Ihrem AndroidManifest.xml deklarieren.

Vollständige Erklärung:

Ich hatte dieses Problem für TOO LONG, weil ich sowohl absolute als auch relative <application .../>, <activity .../>, <receiver .../> und <service .../>-Deklarationen in meinem AndroidManifest.xml verwendete. So habe ich es behoben:

Vergewissern Sie sich, dass in AndroidManifest.xml die <manifest .../>-Eigenschaft des package:-Abschnitts korrekt angegeben ist. Es muss also genau der absolute Pfad angegeben werden:

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

Da Sie nun den richtigen absoluten Pfad in Ihrem <manifest .../>-Abschnitt angegeben haben, müssen Sie einen relativen Pfad für alle in Ihrem <application .../> definierten <activity .../>, <receiver .../>, <service .../> und AndroidManifest.xmls verwenden.

Beispiele:

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

Natürlich sollten Sie auch Ihr Projekt reinigen.

3
Sakiboy

Wenn wir eine signierte apk-Datei generieren, wenn wir ein Problem mit der Abhängigkeitsbibliothek haben (doppelte Jar-Bibliothek), kann dieser Fehler manchmal auftreten. Überprüfen Sie den Erstellungspfad und entfernen Sie die doppelte Bibliothek. Überprüfen Sie, ob eine Bibliothek in der Registerkarte "Auftrag" und "Export" nicht markiert ist.

1
Dhiren

Der Grund ist, dass Android die spezifische Aktivität im Dexpath nicht finden kann.

Daher sollten wir den gesamten Pfad der Aktivitäten in "Manifest-Datei" angeben.

ihr Aktivitätsname lautet beispielsweise "SplashActivity" und steht in "com.packagename.package". Wir sollten also den gesamten Paketnamen dieser Aktivität angeben.

com.packagename.package.SplashActivity
1
Kona Suresh

Ich fügte hinzu 

compile "com.Android.support:support-core-utils:25.3.1"
compile 'com.Android.support:support-v4:25.3.1'
0
SpyZip

Ich hatte ein ähnliches Problem, hier ist meine Lösung:

  1. Ändern Sie den Anwendungsnamen in AndroidManifest in den vollständigen Pfad
  2. Projekt reinigen
  3. Projekt neu erstellen
  4. APK erstellen
0
Jaleel Adesina

Ich habe einen ähnlichen Fehler erhalten, nachdem ich meinen Verzeichnisnamen geändert habe, indem Sie einfach den Verzeichnisnamen umbenennen und importieren. Kann nicht mehr installieren. Aktivieren Sie weder das USB-Debugging noch die Funktion "Projekt neu erstellen".

Ich löse es, indem Sie ein neues Projekt erstellen und alle relevanten Inhalte manuell in ein neues Projekt kopieren.

0
林果皞