Android Activity ClassNotFoundException - все перепробовал

83

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

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

Мэтью Рэтбоун
источник
1
Ваша деятельность находится в библиотеке или в приложении?
Jeshurun
Это в приложении. Он расширяет базовую деятельность в библиотечном проекте.
Мэтью Рэтбоун
Вы строите с помощью Ant или ADT? похоже, что файлы dex не содержат классов библиотеки.
Tomasz Gawel 02
Ошибка означает, что ваше местоположение действия - com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity - явно неверно. Попробуйте добавить уровень пакета в пакет проекта, которого нет в библиотеке, например ... eastersays.myapp.EasterSimonSaysActivity и укажите com.matthewrathbone.eastersays.myapp в качестве пакета в манифесте. Но не добавляйте в библиотеку уровень myapp, чтобы путь к проекту в манифесте отличался от пути фреймворка библиотеки.
Gunnar Karlsson
1
iqadd.com/item/noclassdeffounderror-adt-fix : Ссылка не работает: /
Nishant.

Ответы:

148

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

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

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

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

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

Йорк
источник
1
Вы, друг мой, гений. Что интересно в этом, так это то, что я всегда включал одну библиотеку «неправильно», и это сработало. Поэтому, когда я реорганизовал две библиотеки, я подумал, что это что-то, что я сделал по-другому. Вы только что сэкономили мне часы и часы работы.
Мэтью Рэтбоун
Забавно, но он работал раньше, я думаю, обновление моих инструментов sdk изменило поведение. Это было очень неочевидно.
Мэтью Рэтбоун
3
Да, при обновлении SDK Tools до> ADT 17 эта ошибка возникает из-за изменения способа обработки библиотек в текущей версии ADT. Отъезд: iqadd.com/item/noclassdeffounderror-adt-fix
Ник,
2
При обновлении до ADT 22 возникла аналогичная проблема: stackoverflow.com/questions/16596969/…
Нильс,
7
Кто-нибудь, пожалуйста, дайте мне знать, где я могу найти Properties? Кажется, я нигде не могу его найти.
живо
8

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

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

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

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

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

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

разработчик Android
источник
Итак, вы правы, если я расширю Activity напрямую, это сработает. Мой порядок сборки совпадает с вашим, поэтому я не могу найти способ исправить это таким образом. Есть другие идеи?
Мэтью Рэтбоун
это действительно странно. попробуйте обновить sdk & adt. Кроме того, сообщите мне, есть ли несколько проектов библиотеки (или файлов jar, или обоих), которые использует ваше приложение. если это так, попробуйте немного поиграть с порядком пути сборки (я бы попробовал поставить библиотеки раньше). Кроме того, у меня есть еще один вопрос: вы создали класс, который называется «Activity», и, возможно, вы расширили его вместо класса android?
разработчик Android
Есть 2 проекта библиотеки, второй (движок) зависит как от simonSays, так и от проекта android. Я перепробовал все комбинации порядка сборки, экспортируя проект двигателя из SimonSays. Ответ на ваш вопрос: у меня нигде нет класса под названием activity.
Мэтью Рэтбоун
двигатель - это ядро. другие проекты должны использовать его, а не наоборот. только проект, который является проектом Android (то есть не проект библиотеки), должен иметь манифест, который включает в себя отклонение всех действий, услуг и т.д ... манифест в проектах библиотеки Android (в настоящее время) не имеет большого значения (см. это для получения дополнительной информации: stackoverflow.com/a/10445630/878126 )
разработчик Android
1
они должны были иметь. просто файл манифеста может быть очень коротким и почти ничего не включать. также проверьте файл project.properties (в каждом из проектов), что его целевой sdk равен 15, поскольку это последняя версия на данный момент. Если хотите, можете написать мне в личку, и я исправлю проекты.
разработчик Android
2

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

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


Какие бывают библиотечные проекты :

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

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

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


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

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

Алекс Локвуд
источник
Да, я абсолютно правильно относился к отдельным проектам, именно то, как я ссылался на проекты библиотеки, на самом деле вызывало проблему. Тем не менее, спасибо за отличную помощь!
Мэтью Рэтбоун
нп ... это того стоило попробовать, ха-ха
Alex Lockwood
2

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

PSchuette
источник
Это исправило это для меня. включая только v4-support.jar, поскольку библиотека не работает.
whiteagle
2

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

В Eclipse:

Project properties -> Java Build Path -> Source tab

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

>MyProject/gen
>MyProject/src

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

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

Гонсало
источник
1

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

    android:hasCode="false" 

Снимите это и будьте счастливы. (Я наконец-то был) :)

Корона
источник
Огромное спасибо!! Это сводило меня с ума. Это сработало для меня, у меня была фиктивная MainActivity, которая просто загружала так. На поиск комментария ушло 2 дня!
AdrianTut
1

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

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

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

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

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

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

лазить
источник
1

удалить classes.dex из корзины и перестроить проект

Афзал Ифтихар
источник
0

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

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

Чарльз Харли
источник
все версии одинаковые, android 2.2.
Мэтью Рэтбоун
0

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

Люк
источник
0

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

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

скорее я поставил это

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

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

Химадри брюки
источник
0

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

Крисс
источник
0

У меня возникала такая ошибка, я пробовал все, но не нашел решения. тогда я понял, используете ли вы библиотеку в качестве файла aar, тогда вам нужно добавить все зависимости вашей библиотеки aar в файл приложения gradle.build. если кто-то не придумал решение, попробуйте это!

Джунаид Башир
источник
-1

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

Каушал Триведи
источник