Активность Android ClassNotFoundException – все

Я только что обновил приложение в библиотеке фреймворка и приложении, но теперь, когда я пытаюсь запустить приложение в эмуляторе, я получаю следующую трассировку стека ошибок:

06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main 06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk] 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.os.Handler.dispatchMessage(Handler.java:99) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.os.Looper.loop(Looper.java:123) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.main(ActivityThread.java:4627) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.reflect.Method.invokeNative(Native Method) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.reflect.Method.invoke(Method.java:521) 06-02 18:22:35.529: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 06-02 18:22:35.529: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 06-02 18:22:35.529: E/AndroidRuntime(586): at dalvik.system.NativeStart.main(Native Method) 06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk] 06-02 18:22:35.529: E/AndroidRuntime(586): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577) 06-02 18:22:35.529: E/AndroidRuntime(586): ... 11 more 

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

Вот мой класс активности:

 package com.matthewrathbone.eastersays; import android.os.Bundle; import com.rathboma.simonsays.Assets.Season; import com.rathboma.simonsays.SeasonPicker; import com.rathboma.simonsays.SimonSaysActivity; public class EasterSimonSaysActivity extends SimonSaysActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } @Override public SeasonPicker getSeasonPicker() { return new SeasonPicker(){ @Override public Season getSeason() { // TODO Auto-generated method stub return Season.EASTER; } }; } } 

Как видите, в манифесте он правильно указан:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.matthewrathbone.eastersays" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".EasterSimonSaysActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Я понятия не имею, как это исправить, и был бы признателен за любую помощь. Я просмотрел много похожих вопросов на SO, не видя этого конкретного поведения.

Больше информации:

  • Я проверил внутри сгенерированного APK, и класс имеет запись в файле classes.dex
  • Я пробовал очистить / построить проект в eclipse
  • Я пробовал использовать совершенно новое изображение устройства, на котором уже нет копии APK
  • Я изменил проект библиотеки в обычную java, а затем перешел обратно в проект Android, без разницы
  • Добавление абстрактного SimonSaysActivity к манифесту не имеет значения.
  • Я попытался сделать каждую зависимость проектом андроидной библиотеки и синхронизировать требуемую версию Android, это не помогло

Найдено решение (см. Ниже). Каждому, кто отправил ответ / комментарий: вы все рок, спасибо, что помогли мне справиться с проблемами!

Похоже, что это внедряется при обновлении инструментов SDK. Спасибо @Nick ниже в комментариях по этой ссылке: http://iqadd.com/item/noclassdeffounderror-adt-fix

Solutions Collecting From Web of "Активность Android ClassNotFoundException – все"

Я провел некоторое время с моим собственным проектом, и я могу реплицировать вашу проблему и получить точно такую ​​же трассировку стека исключений при попытке запустить мой основной проект, поэтому я думаю, что это может быть причиной:

Как и то, что я думал, речь идет о том, как вы ссылаетесь на свой проект библиотеки Android в основном проекте Android, простые настройки конфигурации Eclipse.

Неправильный путь:
Щелкните правой кнопкой мыши главный проект, выберите « Properties -> Java Build Path -> Projects -> Add... , это добавит проект библиотеки Android в качестве проекта зависимости в пути построения основного проекта Android, это не сработает. Если все необходимые ресурсы, связанные с Android, определены в основном проекте, во время компиляции вы не получите никаких ошибок, но при запуске приложения вы получите исключение, описанное в вопросе.

Правильный путь:
Щелкните правой кнопкой мыши основной проект, выберите « Properties -> Android в разделе «Библиотека», добавьте здесь свой проект библиотеки Android. Ознакомьтесь с официальным руководством разработчика. Ссылка на проект библиотеки . Это должно устранить все ваши проблемы. Также обратите внимание, что вам необходимо использовать ссылку относительного пути для фактического проекта библиотеки Android, как указано в соображениях Библиотечного проекта – Разработка .

Надеюсь это поможет.

Я тестировал код, который вы указали, и он отлично работает. Попробуйте изменить «extends SimonSaysActivity» на просто «extends Activity» и убедитесь, что он работает.

Причина, по которой он не работает, – либо SimonSaysActivity не расширяет Activity (что я не думаю, что вы допустили эту ошибку), либо порядок пути сборки неверен.

Чтобы перейти к порядку пути сборки, перейдите по ссылке:

 project->properties->Java build path->order and export . 

Мой основной порядок: проект src, проект gen, android 4.0.3, андроидные зависимости.

Эта проблема обычно возникает при использовании библиотек.

Я только что переработал приложение в библиотеку фреймворка и приложение.

Я не совсем уверен, что вы здесь пытаетесь сказать, но тот факт, что вы использовали слово «refactored», приводит меня к мысли, что вы неправильно понимаете концепцию библиотечного проекта.


Какие проекты библиотеки:

Проект библиотеки – это проект разработки, содержащий общий исходный код и ресурсы. Другие проекты для Android могут ссылаться на проект библиотеки и включать их скомпилированные источники в свои .apk-файлы во время компиляции.

В каких библиотечных проектах нет :

Проект библиотеки отличается от стандартного Android-проекта тем, что вы не можете скомпилировать его непосредственно в один файл .apk и запустить его на устройстве Android. Вы не можете использовать проекты Android в качестве проекта библиотеки, а затем еще один проект Android расширяет проект библиотеки. Это не работает.


Тем не менее, я бы исследовал структуру вашего библиотечного проекта и гарантировал, что вы правильно настроили его . Вполне нормально использовать вашу библиотеку для хранения общего кода / ресурсов, но если ваша библиотека пытается вести себя так, как если бы она была отдельным .apk в самом проекте библиотеки, то вы, вероятно, сделали что-то не так. Я считаю, что ClassNotFoundException было бы выброшено, если бы это было так. Чтобы исправить эту проблему, я просто создаю проект библиотеки с нуля, вместо того, чтобы пытаться преобразовать проект Android в проект библиотеки. Это не позволит вам запутаться в крошечные, раздражающие ошибки.

Не стесняйтесь публиковать больше кода, если у вас все еще есть проблемы. Вы должны также подробнее рассказать о структуре (и цели) вашего проекта библиотеки … почему вы решили использовать его, как вы его создали и т. Д.

У меня была эта проблема с проектом, над которым я работал, хотя мое дело было другим. Если кто-то еще не может найти решение своей проблемы, попробуйте проверить это:

В Eclipse:

 Project properties -> Java Build Path -> Source tab 

Внутри вы найдете список со всеми исходными папками, которые должны быть скомпилированы и помещены в сгенерированный apk каждый раз для создания вашего проекта (и / gen ). Tipically:

 >MyProject/gen >MyProject/src 

То, что вы хотите быть уверенным, заключается в том, что внутри каждой из исходных папок (exclude / gen , поэтому only / src в этом случае) элемент « Output folder помещается в выходную папку по умолчанию, которая представляет собой MyProject/bin/classes . Сделайте это, выбрав «Выходная папка» и нажав «Удалить» с помощью правильного набора кнопок (это укажет на папку по умолчанию).

Если вы не видите папку вывода subitem, установите флажок «Разрешить выходные папки для исходных папок» прямо под списком

Для Eclipse Kepler (Mac): проект Control-click -> Инструменты Android -> добавить библиотеку поддержки

ClassNotFoundException в Java является подклассом java.lang.Exception и возникает, когда Java Virtual Machine пытается загрузить определенный класс и не находит запрошенный класс в classpath.

Подробнее: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

Попробуйте перейти в Project -> Properties -> Java Build Path -> Order & Export And Confirm. Частные библиотеки Android проверяются для вашего проекта и для всех других проектов библиотеки, которые вы используете в своем приложении.

Как бороться с ClassNotFoundException

  1. Убедитесь, что имя запрошенного класса верное и что в вашем пути к классам существует соответствующий .jar- файл. Если нет, вы должны явно добавить его в путь к классу приложения.
  2. В случае, если указанный файл .jar существует в вашем пути к классу, тогда путь к классам вашего приложения становится чрезмерно высоким, и вы должны найти точный путь к классам, используемый вашим приложением.
  3. Если исключение вызвано сторонним классом, вы должны определить класс, который генерирует исключение, а затем добавить отсутствующие .jar- файлы в свой путь к классам .

Хотя это не применимо для всех, я недавно столкнулся с этой проблемой, потому что мой проект не связывался с общей библиотекой, присутствующей на устройстве. Я забыл указать в своем манифесте, что мое приложение <uses-library> .

Удалить classes.dex из bin и перестроить проект

Какие интерфейсы или родительские классы используют / расширяют SimonSaysActivity и доступны ли они в версии Android, которую вы используете? Я видел подобные проблемы, когда в моей активности реализован интерфейс API, который не был доступен в версии Android, которую я использовал.

В моем случае моя активность реализовала интерфейс PopupMenu.OnDismissListener, который доступен только в API 14, но когда я запустил приложение на своем 2.3-устройстве, я получил исключение java.lang.NoClassDefFoundError для этой активности.

У меня была такая же проблема, и я потратил большую часть времени на то, чтобы пробовать всевозможные вещи. Приложение запускало поиск при развертывании с одного компьютера, но не на этом ПК. В конце концов, это был недостающий характер джава! Странно, как он показал мне пути создания java, порядок / экспорт и все это, но все же не имел java-природы. 🙁 Надеюсь, это сэкономит кому-то еще много времени

Если вы следовали всем подсказкам (проверяли частные библиотеки и т. Д.) И все еще имели ошибку. Проверьте свой манифест для этой строки кода в теге приложения

  android:hasCode="false" 

Удалите его и будьте счастливы. (Я был наконец) 🙂

Решение, предоставленное @yorkw, абсолютно корректно. У меня была дополнительная проблема, в одном из файлов макета я неправильно упомянул абсолютное имя. Это должно было быть

 <android.support.v4.view.ViewPager xmlns:android="... 

Скорее я это положил

 <android.support.v4.app.view.ViewPager xmlns:android="... 

После их разрешения он работал хорошо.

Верьте или нет, исправление для меня состояло в том, чтобы удалить старую версию (2.0) библиотеки Google Analytics из моего проекта, пробовав все в течение как минимум 4 часов. Конечно, обновление этой библиотеки также может быть решением. Таким образом, это может быть проблема с версией управления версиями.

У меня была такая же проблема. Но затем я проверил текущую структуру приложения. Я обнаружил, что более старая структура приложения (я не знаю, время, когда она была изменена разработчиками платформы Android) имеет имя папки "lib" которое теперь является "libs" . Я переношу все файлы jar в «libs», и ошибка исчезла. Надеюсь, это может кому-то помочь 🙂

Попробуйте сделать свой манифест примерно таким.

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="zvjezdan.veselinovic.yahtzee_" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".YahtzeeActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name = ".Scoring_Page" /> </application> </manifest> 

Причина этого в том, что:
public class EasterSimonSaysActivity extends SimonSaysActivity {

Использует другое действие. Поэтому, если у вас есть 2 действия, вам нужно добавить их оба. Конечно, вы импортировали их, но ваш манифест должен тоже это знать. Вот как я «переключил страницы» для моего проекта yahtzee. На что мне все еще нужна помощь. знак равно