Активность 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
Ответы
Ответ 1
Я провел некоторое время с моим собственным проектом, и я могу реплицировать вашу проблему и получить точно такую же трассировку стека исключений при попытке запустить мой основной проект, поэтому я думаю, что это может быть причиной:
Точно так же, как я думал, речь идет о том, как вы ссылаетесь на проект вашей библиотеки Android в основном проекте Android, простые настройки конфигурации Eclipse.
Неверный путь:
Щелкните правой кнопкой мыши основной проект, выберите Properties -> Java Build Path -> Projects -> Add...
, это добавит проект библиотеки Android в качестве проекта зависимости в основной путь создания проекта Android, это не сработает. Если все необходимые ресурсы, связанные с Android, определены в основном проекте, во время компиляции вы не получите никаких ошибок, но при запуске приложения вы получите исключение, описанное в вопросе.
Правильный путь:
Щелкните правой кнопкой мыши основной проект, выберите Properties -> Android
, в разделе "Библиотека", добавьте проект вашей библиотеки Android здесь. Ознакомьтесь с официальным руководством разработчика Ссылка на проект библиотеки. Это должно устранить все ваши проблемы. Также обратите внимание, что вам нужно использовать ссылку относительного пути для фактического проекта библиотеки Android, как указано в "Проект библиотеки" - "Разработка" .
Надеюсь, что это поможет.
Ответ 2
Я протестировал код, который вы указали, и он отлично работает.
попробуйте изменить "extends SimonSaysActivity", чтобы просто "расширять активность" и убедиться, что он работает.
причина, по которой он не работает, - либо SimonSaysActivity не расширяет Activity (что я не думаю, что вы допустили эту ошибку), либо неправильный порядок пути сборки.
чтобы перейти к порядку пути сборки, перейдите к:
project->properties->Java build path->order and export .
Мой основной заказ: project src, gen, android 4.0.3, андроидные зависимости.
эта проблема обычно возникает при использовании библиотек.
Ответ 3
Я только что обработал приложение в библиотеке фреймворка и приложении.
Я не совсем уверен, что вы здесь пытаетесь сказать, но тот факт, что вы использовали слово "refactored", приводит меня к мысли, что вы неправильно понимаете концепцию проекта библиотеки.
Какие проекты библиотеки являются:
Проект библиотеки - это проект разработки, содержащий общий исходный код и ресурсы. Другие проекты Android могут ссылаться на проект библиотеки и включать в него компилируемые источники в их .apk файлы во время компиляции.
Какие проекты библиотеки не:
Проект библиотеки отличается от стандартного проекта Android тем, что вы не можете скомпилировать его непосредственно в один файл .apk
и запустить его на устройстве Android. Вы не можете использовать проекты Android в качестве проекта библиотеки, а затем еще один проект Android расширяете проект библиотеки. Это не работает.
Тем не менее, я бы исследовал структуру вашего проекта библиотеки и гарантировал, что вы правильно настроили. Хорошо использовать библиотеку для хранения общего кода/ресурсов, но если ваша библиотека пытается вести себя так, как если бы она была отдельным .apk
внутри самого проекта библиотеки, то вы, вероятно, сделали что-то неправильно. Я полагаю, что ClassNotFoundException
будет выброшено, если бы это было так. Чтобы исправить эту проблему, я просто создаю проект библиотеки с нуля, вместо того, чтобы пытаться преобразовать проект Android в проект библиотеки. Это не позволит вам запутаться в крошечные, раздражающие ошибки.
Не стесняйтесь публиковать больше кода, если у вас все еще есть проблемы. Вы также должны подробно рассказать о структуре (и цели) вашего проекта библиотеки... почему вы решили использовать его, как вы его создали и т.д.
Ответ 4
Для Eclipse Kepler (Mac): проект Control-click → Инструменты Android → добавить библиотеку поддержки
Ответ 5
У меня была эта проблема с проектом, над которым я работал, хотя мое дело было другим.
Если кто-то еще не может найти решение своей проблемы, попробуйте проверить это:
В Eclipse:
Project properties -> Java Build Path -> Source tab
Внутри вы найдете список со всеми исходными папками, которые должны быть скомпилированы и помещены в сгенерированный apk каждый раз для создания вашего проекта (и /gen). Tipically:
>MyProject/gen
>MyProject/src
То, что вы хотите быть уверенным, заключается в том, что внутри каждой из исходных папок (exclude /gen, поэтому только /src) в этом случае элемент Output folder
указывает на выходную папку по умолчанию, которая имеет значение MyProject/bin/classes
. Сделайте это, выбрав "Выходная папка" и нажав "Удалить" с помощью правильного набора кнопок (это укажет на папку по умолчанию).
Если вы не видите папку вывода подэлемента, установите флажок "Разрешить папки вывода для исходных папок" прямо под списком
Ответ 6
classNotFoundException в Java является подклассом java.lang.Exception и приходит, когда Java Virtual Machine пытается загрузить определенный класс и не нашел запрошенный класс в пути к классам.
Подробнее: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA
Попробуйте Project -> Properties -> Java Build Path -> Order & Export
И Подтвердить частные библиотеки Android проверяются для вашего проекта и для всех других проектов библиотек, которые вы используете в своем приложении.
Как работать с ClassNotFoundException
- Убедитесь, что имя запрашиваемого класса верное и что
соответствующий файл .jar существует в вашем пути к классам. Если нет, вы должны
явно добавьте его в свой путь к классам приложений.
- Если указанный файл .jar существует в вашем пути к классу, тогда ваш
приложения classpath становится все более сложным, и вы должны найти
точный путь к классам, используемый вашим приложением.
- Если исключение вызвано сторонним классом, вы должны
определить класс, который генерирует исключение, а затем добавить
отсутствуют .jar файлы в вашем пути к классам.
Ответ 7
Пока это не применимо для всех, я недавно столкнулся с этой проблемой, потому что мой проект не связывался с общей библиотекой, присутствующей на устройстве. Я забыл указать в своем манифесте, что мое приложение <uses-library>
.
Ответ 8
удалить classes.dex из bin и перестроить проект
Ответ 9
Какие интерфейсы или родительские классы используют/расширяют SimonSaysActivity и доступны ли они в версии Android, которую вы используете? Я видел аналогичные проблемы, когда моя активность реализовала интерфейс API, который не был доступен в версии Android, которую я использовал.
В моем случае моя активность реализовала интерфейс PopupMenu.OnDismissListener, доступный только в API 14, но когда я запустил приложение на своем 2.3-устройстве, я получил исключение java.lang.NoClassDefFoundError для активности.
Ответ 10
У меня была такая же проблема, и я потратил большую часть времени на то, чтобы пробовать всевозможные вещи. Приложение запускало поиск при развертывании с одного компьютера, но не на этом компьютере. В конце концов, это был недостающий Java-характер! Странно, как это показало мне пути создания java, порядок/экспорт и все это, но все же не было java-природы.:( Надеюсь, это сэкономит кому-то еще много времени.
Ответ 11
Если вы следовали всем подсказкам (проверяли частные библиотеки и т.д.) и все еще имели ошибку.
Проверьте свой манифест для этой строки кода в теге приложения
android:hasCode="false"
Удалите его и будьте счастливы. (Я был наконец):)
Ответ 12
Решение предоставленное @yorkw, абсолютно корректно. У меня была дополнительная проблема, в одном из файлов макета я неправильно упомянул абсолютное имя. Это должно быть
<android.support.v4.view.ViewPager xmlns:android="...
Скорее всего, я положил его
<android.support.v4.app.view.ViewPager xmlns:android="...
после разрешения этих проблем он работал хорошо.
Ответ 13
Верьте или нет, исправление для меня состояло в том, чтобы удалить старую версию (2.0) библиотеки Google Analytics из моего проекта, пробовав все в течение как минимум 4 часов. Конечно, обновление этой библиотеки также может быть решением.
Таким образом, это может быть проблема с версией управления версиями зависимостей.
Ответ 14
У меня была такая же проблема.
Но затем я проверил текущую структуру приложения. Я обнаружил, что более старая структура приложения (я не знаю, время, которое она изменила разработчиками платформы Android) имеет имя папки "lib"
, которая теперь "libs"
.
Я переношу все файлы jar в "libs", и ошибка исчезла.
Надеюсь, это может кому-то помочь:)
Ответ 15
Попробуйте сделать свой манифест примерно таким.
<?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. Который мне все еще нужна помощь. =/