NoClassDefFoundError – отклонение повторного инициализации в ранее не пройденном классе

Пожалуйста, объясните мне, что означает эта ошибка и как ее избежать.

Через некоторое время приложение приложения закрывается из-за этой ошибки:

09-28 12:53:45.746 I/dalvikvm(29489): Rejecting re-init on previously-failed class Lcom/bartat/android/ui/task/AsyncTaskExt; v=0x0 09-28 12:53:45.748 D/AndroidRuntime(29489): Shutting down VM 09-28 12:53:45.755 I/am_crash( 1146): [29489,com.bartat.android.secret,572996,java.lang.NoClassDefFoundError,com.bartat.android.ui.task.AsyncTaskExt,CommandsActivity.java,726] 09-28 12:53:45.755 I/am_finish_activity( 1146): [1079225264,123,com.bartat.android.secret/.CommandsActivity,crashed] 09-28 12:53:45.750 W/dalvikvm(29489): threadid=1: thread exiting with uncaught exception (group=0x40015560) 09-28 12:53:45.752 E/AndroidRuntime(29489): FATAL EXCEPTION: main 09-28 12:53:45.752 E/AndroidRuntime(29489): java.lang.NoClassDefFoundError: com.bartat.android.ui.task.AsyncTaskExt 

Эта проблема не может быть решена путем переустановки приложения.

Если я, например, переименую AsyncTaskExt в AsyncTaskExt2 то он работает снова надолго. Но через несколько недель / месяцев он снова начал эту ошибку.

Что это значит? Почему он брошен и как его избежать, не переименовывая класс?

Пожалуйста, помогите мне, Tamás

Это происходит, когда класс не может быть загружен по разным причинам. К сожалению, новое время выполнения АРТ не регистрирует достаточную информацию относительно причины этого. Если вы можете заполучить более старое Android-устройство с Dalvik, вы увидите разный журнал, как правило, выявляя преступление с большей точностью.

В прошлый раз, когда я видел это вживую, мне приходилось иметь дело с файлом JAR, который фактически не включал или не перечислял его зависимости, поэтому добавление правой зависимой библиотеки в файл gradle позволило решить проблему. Самая большая проблема заключается в том, чтобы понять, какие классы пропали без вести – что-то может сообщить вам dalvik logs / decompilation / documentation.

Существует множество других причин, по которым классы не могут быть загружены во всей полноте языка Java, поэтому эта конкретная причина может не применяться повсеместно.

Вы должны добавить библиотеку uses в вашем AndroidManifest.xml

Я начал эту проблему после создания другого проекта с включенной аналитикой New Relic. Демон Gradle затем кэшировал агента New Relic, и он не смог запустить другое приложение.

Что помогло

 ./gradlew --stop 

Случается для меня, только если мгновенный запуск включен.

Вы уверены, что это первое исключение, которое вы получаете после запуска вашего приложения? Иногда могут быть некоторые неперехваченные исключения.