Android Activity 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
Обычно это означает, что файл манифеста каким-то образом неверен, но я дважды проверил все, что смог придумать.
Вот мой класс activity:
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 и синхронизировать версию Android, которая им требуется, это не помогло
Нашел решение (см. Ниже). Всем, кто опубликовал ответ / комментарий: Вы все молодцы, спасибо, что помогли мне разобраться с проблемами!
Похоже, это введено обновлением SDK tools. Спасибо @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 " на просто "extends Activity " и убедитесь сами, что это работает.
причина, по которой это не работает, заключается либо в том, что SimonSaysActivity не расширяет Activity (я не думаю, что вы допустили эту ошибку) , либо в неправильном порядке пути сборки .
чтобы перейти к порядку пути сборки, перейдите по ссылке :
project->properties->Java build path->order and export .
мой основной заказ таков : project src , project gen , android 4.0.3 , зависимости Android .
эта проблема обычно возникает при использовании библиотек .
Ответ 3
Я только что реорганизовал приложение в библиотеку фреймворка и приложение.
Я не совсем уверен, что вы пытаетесь здесь сказать, но тот факт, что вы использовали здесь слово "переработанный", наводит меня на мысль, что вы неправильно понимаете концепцию библиотечного проекта.
Что такое библиотечные проекты:
Проект библиотеки - это проект разработки, который содержит общий исходный код и ресурсы. Другие проекты Android могут ссылаться на проект библиотеки и включать его скомпилированные исходники в свои файлы .apk во время компиляции.
Какими библиотечными проектами не являются:
Проект библиотеки отличается от стандартного проекта Android тем, что вы не можете скомпилировать его непосредственно в один .apk
файл и запустить на устройстве Android. Вы не можете использовать Android projects в качестве проекта библиотеки, а затем иметь другой Android Project, расширяющий проект библиотеки. Это так не работает.
Тем не менее, я бы исследовал структуру вашего библиотечного проекта и убедился, что вы настроили его правильно. Использовать вашу библиотеку для хранения общего кода / ресурсов нормально, но если ваша библиотека пытается вести себя так, как если бы она была отдельной .apk
внутри самого проекта библиотеки, то вы, вероятно, сделали что-то не так. Я полагаю, что в этом случае было бы выдано ClassNotFoundException
. Чтобы решить проблему, я бы просто создал проект библиотеки с нуля, а не пытался преобразовать проект Android в проект библиотеки. Это предотвратит появление крошечных раздражающих ошибок.
Не стесняйтесь публиковать больше кода, если у вас все еще возникают проблемы. Вам также следует подробнее рассказать о структуре (и назначении) вашего проекта библиотеки... почему вы решили использовать ее, как вы ее создали и т.д.
Ответ 4
Для Eclipse Kepler (Mac): щелкните проект -> Инструменты Android -> добавить библиотеку поддержки