Я только что преобразовал приложение в библиотеку фреймворка и приложение, но теперь, когда я пытаюсь запустить приложение в эмуляторе, я получаю следующую трассировку стека ошибок:
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 и синхронизировать требуемую версию Android, это не помогло.
Нашел решение (см. Ниже). Всем, кто опубликовал ответ / комментарий: Вы все молодцы, спасибо, что помогли мне справиться с проблемами!
Похоже, это связано с обновлением инструментов SDK. Спасибо @Nick ниже в комментариях к этой ссылке: http://iqadd.com/item/noclassdeffounderror-adt-fix
источник
Ответы:
Я потратил некоторое время на игру со своим собственным проектом, и я могу воспроизвести вашу проблему и получить точно такую же трассировку стека исключений при попытке запустить мой основной проект, поэтому я думаю, что это может быть причиной:
Как я и думал, все дело в том, как вы ссылаетесь на свой проект библиотеки Android в основном проекте Android, в простых настройках конфигурации Eclipse.
Неправильный путь:
щелкните основной проект правой кнопкой мыши, выберите
Properties -> Java Build Path -> Projects -> Add...
, это добавит проект библиотеки Android в качестве проекта зависимости в путь сборки основного проекта Android, это не работает. Если все необходимые ресурсы, связанные с Android, определены в основном проекте, вы не получите никаких ошибок во время компиляции, но при запуске приложения вы получите исключение, описанное в вопросе.Правильный способ:
щелкните основной проект правой кнопкой мыши, выберите
Properties -> Android
в разделе «Библиотека» добавьте сюда свой проект библиотеки Android. Ознакомьтесь с официальным руководством разработчика Ссылка на проект библиотеки . Это должно решить все ваши проблемы. Также обратите внимание, что вы должны использовать ссылку относительного пути к фактическому проекту библиотеки Android, как указано в проекте библиотеки - Рекомендации по разработке. .Надеюсь это поможет.
источник
Properties
? Кажется, я нигде не могу его найти.Я проверил код, который вы дали, и он отлично работает. попробуйте заменить «extends SimonSaysActivity» просто «extends Activity» и убедитесь сами, что это работает.
Причина того, что это не работает, заключается в том, что либо SimonSaysActivity не расширяет Activity (что я не думаю, что вы допустили эту ошибку), либо порядок пути сборки неправильный.
чтобы перейти к порядку пути сборки, перейдите по ссылке:
мой основной порядок: проект src, проект gen, android 4.0.3, зависимости от android.
эта проблема обычно возникает при использовании библиотек.
источник
Я не совсем уверен, что вы здесь пытаетесь сказать, но тот факт, что вы использовали здесь слово «рефакторинг», наводит меня на мысль, что вы неправильно понимаете концепцию библиотечного проекта.
Какие бывают библиотечные проекты :
Проект библиотеки - это проект разработки, который содержит общий исходный код и ресурсы. Другие проекты Android могут ссылаться на проект библиотеки и включать его скомпилированные исходники в свои файлы .apk во время компиляции.
Каких библиотечных проектов нет :
Проект библиотеки отличается от стандартного проекта Android тем, что вы не можете скомпилировать его напрямую в один
.apk
файл и запустить на устройстве Android. Вы не можете использовать проекты Android в качестве проекта библиотеки, а затем попросить другой проект Android расширить проект библиотеки. Так не работает.Тем не менее, я бы исследовал структуру вашего библиотечного проекта и убедился, что вы настроили его правильно . Можно использовать вашу библиотеку для хранения общего кода / ресурсов, но если ваша библиотека пытается вести себя так, как если бы она была отдельной
.apk
внутри самого проекта библиотеки, то вы, вероятно, сделали что-то не так. Я считаю,ClassNotFoundException
что если бы это было так, было бы брошено a . Чтобы решить эту проблему, я бы просто создал проект библиотеки с нуля, вместо того, чтобы пытаться преобразовать проект Android в проект библиотеки. Это предотвратит появление крошечных раздражающих ошибок.Не стесняйтесь размещать дополнительный код, если у вас все еще есть проблемы. Вы также должны немного подробнее рассказать о структуре (и цели) вашего библиотечного проекта ... почему вы решили его использовать, как вы его создали и т. Д.
источник
Для Eclipse Kepler (Mac): щелкните проект, удерживая нажатой клавишу Control -> Инструменты Android -> добавить библиотеку поддержки
источник
У меня была эта проблема с проектом, над которым я работал, хотя мой случай был другим. Если кто-то все еще не может найти решение своей проблемы, попробуйте проверить это:
В Eclipse:
Внутри вы найдете список со всеми исходными папками, которые нужно компилировать и помещать в сгенерированный apk каждый раз для сборки вашего проекта (и / gen ). Типично:
Вы должны быть уверены в том, что внутри каждой из ваших исходных папок (исключая / gen , поэтому только / src в данном случае) элемент
Output folder
помещается в выходную папку по умолчанию, то естьMyProject/bin/classes
. Сделайте это, выбрав Выходную папку и щелкнув Удалить в правом наборе кнопок (это укажет на папку по умолчанию).Если вы не видите подэлемент «Папка вывода», установите флажок «Разрешить папки вывода для исходных папок» прямо под списком.
источник
Если вы следовали всем советам (проверили частные библиотеки и т. Д.), Но ошибка все еще есть. Проверьте свой манифест на наличие этой строки кода в теге приложения
android:hasCode="false"
Снимите это и будьте счастливы. (Я наконец-то был) :)
источник
Подробнее: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA
Попробуйте перейти
Project -> Properties -> Java Build Path -> Order & Export
и подтвердить, что частные библиотеки Android проверены для вашего проекта и для всех других проектов библиотек, которые вы используете в своем приложении.Как бороться с ClassNotFoundException
источник
Хотя это не будет применимо для всех, у меня недавно была эта проблема, потому что мой проект не мог соединиться с общей библиотекой, присутствующей на устройстве. Я забыл указать в манифесте, что мое application
<uses-library>
.источник
удалить classes.dex из корзины и перестроить проект
источник
Какие интерфейсы или родительские классы использует / расширяет SimonSaysActivity и доступны ли они в используемой вами версии Android? Я видел похожие проблемы, когда моя деятельность реализовывала интерфейс API, который не был доступен в используемой мной версии Android.
В моем случае моя деятельность реализовала интерфейс PopupMenu.OnDismissListener, который доступен только в API 14, но когда я запустил приложение на своем устройстве 2.3, я получил исключение java.lang.NoClassDefFoundError для действия.
источник
У меня была та же проблема, и я потратил большую часть дня, пробуя разные вещи. Приложение запускало поиск при развертывании с одного компьютера, но не на этом компьютере. В конце концов, это оказалось отсутствующей java-природой! Странно, как он показал мне пути сборки java, порядок / экспорт и все такое, но еще не имел природы java. :( Надеюсь, это сэкономит кому-то еще много времени
источник
решение, предоставленное @yorkw, абсолютно правильное. У меня была дополнительная проблема, в одном из файлов макета я неправильно указал абсолютное имя. Это должно было быть
<android.support.v4.view.ViewPager xmlns:android="...
скорее я поставил это
<android.support.v4.app.view.ViewPager xmlns:android="...
после их решения он работал хорошо.
источник
Хотите верьте, хотите нет, но исправление для меня заключалось в том, чтобы удалить старую версию (2.0) библиотеки Google Analytics из моего проекта после того, как я попробовал все в течение как минимум 4 часов. Конечно, решением может быть и обновление этой библиотеки. Так что это может быть проблема с версией jar-файла зависимостей.
источник
У меня возникала такая ошибка, я пробовал все, но не нашел решения. тогда я понял, используете ли вы библиотеку в качестве файла aar, тогда вам нужно добавить все зависимости вашей библиотеки aar в файл приложения gradle.build. если кто-то не придумал решение, попробуйте это!
источник
У меня была такая же проблема. Но затем я проверил текущую структуру приложения и обнаружил, что старая структура приложения (я не знаю, когда она была изменена разработчиками фреймворка Android) имеет имя папки,
"lib"
которое есть сейчас"libs"
. Я переношу все свои файлы jar в библиотеки, и ошибка исчезла. Надеюсь, это может кому-то помочь :)источник