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

Обычно это означает, что файл манифеста в некотором смысле неверен, но я дважды проверил все, что могу придумать.

Вот мой класс деятельности:

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
  • Я пытался очистить / построить проект в затмении
  • Я попытался использовать совершенно новый образ устройства, на котором уже нет копии APK.
  • Я изменил проект библиотеки в обычный Java, а затем снова превратился в проект Android, без разницы
  • Добавление абстрактного SimonSaysActivity в манифест не имеет значения.
  • Я пытался сделать каждую зависимость проектом библиотеки Android и синхронизировать требуемую версию Android, но это не помогло.

Нашел решение (см. Ниже). Всем, кто разместил ответ / комментарий: Вы все молодцы, спасибо за помощь в проработке проблем!

Похоже, это представлено обновлением инструментов SDK. Спасибо @Nick ниже в комментариях к этой ссылке: http://iqadd.com/item/noclassdeffounderror-adt-fix

15 ответов

Решение

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

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

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

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

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

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

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

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

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

Мой основной порядок: Project src, Project Gen, Android 4.0.3, зависимости Android.

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

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

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

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


Что такое библиотечные проекты:

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

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

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


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

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

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

В Затмении:

Project properties -> Java Build Path -> Source tab

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

>MyProject/gen
>MyProject/src

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

Если вы не видите подпункт "Выходная папка", установите флажок "Разрешить выходные папки для исходных папок" прямо под списком

Удалите classes.dex из bin и перестройте проект

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

    android:hasCode="false" 

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

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

Узнайте больше: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Попробуйте сделать ваш манифест примерно таким.

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

Другие вопросы по тегам