ClassNotFoundException: Не е намерен клас по пътя: DexPathList

Имам проблем, откакто актуализирах приложението си в playstore. След тази актуализация изключението се хвърля, но не съм променил нищо, свързано с това изключение.

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

Работата е там, че предишната ми версия на приложението работи без проблеми и не съм променил нищо, свързано с тази дейност. Току-що добавих нов диалогов прозорец с информация, който няма нищо общо с тази дейност. Това приложение е безплатна олекотена версия, направих абсолютно същите промени в професионалната версия и там нищо не се хвърля. Това работи според очакванията. Единствената разлика между pro и lite е, че съм интегрирал Admob (по новия начин) в lite версията и Google Play лиценз в pro версията. Но това съм интегрирал от самото начало и не съм правил промени в това. Също така не съм правил никакви промени в манифеста, прочетох много публикации тук, но нищо не помага.

Изглежда, че това се случва само във версии на Android от 5.0. Някой има ли идея какво може да причини този проблем или някой има ли същия опит? Възможно ли е proguard просто да е унищожил нещо чрез обфускация (също тук, без промени)?

Не публикувах код, защото не е важен за този проблем, както казах, не съм правил промени, свързани с това изключение.

Този въпрос е маркиран като дубликат, но не е такъв. Коментарът с връзката не решава проблема ми, всички библиотеки са проверени и интегрирани по правилния начин. Освен това не използвам NDK.


person Opiatefuchs    schedule 23.04.2015    source източник
comment
Това не е дубликат, както описах, защото предполагаемият дублиран въпрос не е в съотношение с моя.   -  person Opiatefuchs    schedule 23.04.2015
comment
Гласували против! дайте ми една единствена причина дали този въпрос заслужава да бъде гласуван против и също така да бъде затворен?   -  person TheLittleNaruto    schedule 23.04.2015
comment
@TheLittleNaruto...понякога се чудя дали тук в SO има хора, които просто гласуват против за забавление. Толкова много пъти виждам въпроси с гласуване против без пояснение и без причина...   -  person Opiatefuchs    schedule 23.04.2015
comment
те трябва да са само неопитни потребители.   -  person TheLittleNaruto    schedule 23.04.2015
comment
@Opiatefuchs бихте ли разрешили този проблем? защото получавам подобна грешка. Но това се случи, когато се опитах да импортирам предишната версия на моята програма от резервно копие.   -  person Masood    schedule 04.05.2015
comment
Да и Не....Реших го само като опитвах отново и отново. След да кажем 10 пъти проработи. Но това се случва от време на време отново, така че няма разпознаваема причина за това поведение...   -  person Opiatefuchs    schedule 04.05.2015
comment
@Opiatefuchs Наскоро се сблъсках с този проблем, същият като вашия. Продължете да актуализирате отговора си. Гласувах в подкрепа на вашите въпроси, нямам нищо против, гласувалите против са глупаци, които се смятат за гении...   -  person Crawler    schedule 08.07.2015
comment
:) @Crawler, Моят отговор все още е актуален. Нямаше друго решение, работеше както описах и не знам защо. Ако имате същия проблем, опитайте нещата по-долу. Ако откриете друг възможен проблем, трябва да го публикувате тук... съжалявам, че не мога да ви помогна повече..   -  person Opiatefuchs    schedule 08.07.2015


Отговори (11)


Актуализация

След дълго време се оказа, че трябва да има нещо общо с proguard. Не мога да кажа какво точно причинява грешката, но опитах малко и това е, което забелязах (това е в моя случай с Eclipse IDE):

  • Трябва да затворя всеки раздел от проекта, който искам да подпиша
  • Трябва да почистя проекта и след почистването не правя нищо, освен да експортирам apk
  • направете малка промяна в манифеста, запазете я и отменете промяната (и запазете)
  • ако има някакъв клас в манифеста, наречен с "YourClass" или ".YourClass", променете го на "com.yourpackage.yourClass"

Това са четирите точки, които направих и след това проработи. Това изглежда подозрително, но мисля, че има проблем с обфускацията. Тъй като без да правя тези точки, мога просто да компилирам своя apk и да го инсталирам от eclipse. За мен няма очевидна причина за това поведение. Също така името на пакета работи без промяна, ако го инсталирам само от eclipse. Надявам се тези точки да помогнат на някого.

person Opiatefuchs    schedule 06.05.2015
comment
Имам същия проблем и въз основа на i стигнах до същото заключение: proguard. Особено след като моите неподписани компилации за отстраняване на грешки работят добре. Забавен страничен ефект: Обърканата подписана компилация води до две икони на едно и също приложение! Все още се опитвам да намеря решение. Използвам Android Studio - person AgentKnopf; 06.08.2015
comment
Искате да кажете като две инсталирани приложения в чекмеджето за приложения на вашето устройство? - person Opiatefuchs; 07.08.2015
comment
Беше инсталирано само едно приложение, но можете да видите две икони на приложения в стартовия панел за приложения. Проблемът не беше свързан с proguard, както първоначално предположих (или поне не изцяло) - дублираните икони и липсващият клас бяха причинени от замяната на AndroidManifest.xml в този конкретен вариант и наличието на две дейности за стартиране xD. Все още имам проблеми с proguard, но предполагам, че това е просто намирането на правилната конфигурация сега. Благодаря ти, че се обърна към мен все пак :) ! - person AgentKnopf; 07.08.2015
comment
Това проработи за мен, просто трябваше да добавя пълното име на класа към моя персонализиран клас Application. Тази грешка възникна само след преместване на проекта на моя локален твърд диск. - person Peter Keefe; 24.04.2017
comment
@Питър... това е интересно. Е, случаят с моя проект не беше такъв, но все пак е добре да се знае. - person Opiatefuchs; 24.04.2017

Ако манифестирате името на пакета е добре, ако сте затворили проекта и в рамките на File Explorer сте преименували проекта си, но след като импортирате такъв, вие отново срещате този проблем, единственият начин тук е да

ИЗТРИЙТЕ ТАЗИ ПАПКА .gradle.

Този може да бъде намерен в папката на проекта с помощта на File Explorer. Има файлове с артефакти, които съдържат името на този стар проект. След като отворите отново проекта в Android Studio, папката ще бъде пресъздадена автоматично.

person CodeToLife    schedule 23.06.2017
comment
Еха. Това беше много специфичен проблем и вие имахте отговор! Много благодаря! - person Alex Sullivan; 01.11.2017

Току-що промених своя gradle от com.android.tools.build:gradle:2.2.2 на com.android.tools.build:gradle:2.2.0,и проблемът е наред!

person 林志文    schedule 15.02.2017
comment
Ти си удивителен! - person Zen Bhatt; 24.03.2017

При мен това се случи, когато името на пакета (име на директория) беше променено.

Разбрах, че папката "build" магически поддържа междинни файлове за компилацията на проекта. Изтрих папка „build“ под папка „app“. Сега gradle трябваше да направи отново всички файлове с новото име на пакета. Сега работи правилно.

person HBB20    schedule 16.05.2017

tl;dr: Това изглежда е причинено от комбинация от относителна и абсолютна декларация в AndroidManifest.xml. Мисля, че най-доброто решение е да използвате относителна нотация, когато декларирате <application .../>, <activity .../>, <receiver .../> и <service .../> във вашия AndroidManifest.xml.

Пълно обяснение:

Имах този проблем ТВЪРДЕ ДЪЛГО, защото използвах както абсолютни, така и относителни <application .../>, <activity .../>, <receiver .../> и <service .../> декларации в моя AndroidManifest.xml. Ето какво направих, за да го поправя:

Във вас AndroidManifest.xml се уверете, че секцията <manifest .../> има своето package: свойство, посочено правилно, ще трябва да бъде точният абсолютен път, така:

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

След като вече имате правилния абсолютен път, посочен във вашия раздел <manifest .../>, ще трябва да използвате относителен път за всички <application .../>, <activity .../>, <receiver .../> и <service .../>, дефинирани във вашия AndroidManifest.xml.

Примери:

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

Разбира се, не забравяйте да почистите проекта си.

person Sakiboy    schedule 19.05.2016

Мисля, че има нещо общо с multidex и множество имена на пакети, ако имате множество модули. Почистете проекта и изтрийте всички build/ папки.

person Ozzz    schedule 24.07.2016

Понякога, когато генерираме подписан apk файл, ако имаме някакъв проблем с библиотеката на зависимостта (дубликат на jar библиотека), тогава може да възникне тази грешка. Моля, проверете пътя за изграждане и премахнете дублиращата се библиотека и проверете дали някоя библиотека не е проверена от раздела за поръчка и експортиране.

person Dhiren    schedule 23.04.2015
comment
Какво имате предвид под ~проверете пътя на компилация? Как да го проверя? - person IgorGanapolsky; 09.08.2016

Причината е, че android не може да намери конкретната дейност в dexpath.

Така че трябва да предоставим целия път на дейностите във „Манифестен файл“.

например името на вашата дейност е "SplashActivity" и е там в "com.packagename.package". Така че трябва да предоставим цялото име на пакета на тази дейност.

com.packagename.package.SplashActivity
person Kona Suresh    schedule 21.11.2016

Имах подобен проблем, ето моето решение:

  1. Променете името на приложението в AndroidManifest на пълен път
  2. Чист проект
  3. Проект за възстановяване
  4. Компилирайте APK
person Jelil Adesina    schedule 09.04.2017

добавих

compile "com.android.support:support-core-utils:25.3.1"
compile 'com.android.support:support-v4:25.3.1'
person SpyZip    schedule 18.04.2017

Получих подобна грешка след промяна на името на моята директория, като просто преименувах името на директорията и импортирах. Вече не може да се инсталира. Нито повторното активиране на USB отстраняване на грешки, нито Rebuild Project работят.

Решавам го, като създавам нов проект и ръчно копирам цялото подходящо съдържание в нов проект.

person Fruit    schedule 02.05.2017
comment
Това може да е дълга задача. Опитайте, като изтриете папката app/build. При мен се получи. - person HBB20; 16.05.2017