Активность 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. Который мне все еще нужна помощь. =/