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


82

Я щойно переробив програму в бібліотеку фреймворку та програму, але тепер, коли я спробую запустити програму в емуляторі, я отримую таке трасування стека помилок:

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


1
Ваша діяльність у бібліотеці чи додатку?
Ієшурун

Це в додатку. Це розширює базову діяльність у проекті бібліотеки.
Метью Ретбоун,

Ви будуєте з мурашкою або з ADT? здається, що файли dex не містять бібліотечних класів.
Томаш Гавел,

Помилка означає, що ваше місцезнаходження "Діяльність" є com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity - явно неправильно. Спробуйте додати рівень пакета до пакету проекту, який не існує в бібліотеці, наприклад ... eastersays.myapp.EasterSimonSaysActivity і вкажіть com.matthewrathbone.eastersays.myapp як пакет у маніфесті. Але не слід додавати рівень "myapp" до бібліотеки, щоб шлях проекту в маніфесті відрізнявся від шляху фреймворку бібліотеки.
Гуннар Карлссон,

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
Ти мій друг, геній. Що цікаво в цьому, так це те, що я завжди включав одну бібліотеку «не в той бік», і вона працювала. Отже, коли я переробив фактори на дві бібліотеки, я подумав, що це те, що я зробив інакше. Ви щойно заощадили мені години роботи.
Matthew Rathbone

дивна річ, це працювало раніше, я думаю, оновлення моїх інструментів sdk змінило поведінку. Це було дуже неочевидно.
Matthew Rathbone

3
Так, оновлення інструментів SDK до> ADT 17 спричиняє цю помилку через зміну способу обробки поточної версії ADT з бібліотеками. Виїзд: iqadd.com/item/noclassdeffounderror-adt-fix
Нік

2
Оновлення до ADT 22 дало подібне питання: stackoverflow.com/questions/16596969/…
Нільс,

7
Хтось, будь ласка, дасть мені знати, де я можу знайти Properties? Здається, ніде не можу знайти.
jlively

8

я протестував код, який ви дали, і він чудово працює. спробуйте змінити параметр "extends SimonSaysActivity" на "просто розширює Activity" і переконайтесь, що це працює.

Причиною того, що це не працює, є те, що SimonSaysActivity не поширює Activity (що, я думаю, ви не допустили цієї помилки), або порядок шляху збірки неправильний.

щоб перейти до порядку шляху збірки, перейдіть до:

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

моє основне замовлення: project src, project gen, android 4.0.3, android залежності.

ця проблема зазвичай виникає, коли ви використовуєте бібліотеки.


Тож ви маєте рацію, якщо я розширюю Activity безпосередньо, це працює. Мій порядок побудови відповідає вашому, тому я не можу знайти спосіб його виправити таким чином. Будь-які інші ідеї?
Метью Ретбоун,

це дійсно дивно. спробуйте оновити sdk & adt. також, будь ласка, скажіть мені, чи існує кілька бібліотечних проектів (або jar-файлів, або обох), які використовує ваш додаток. якщо так, спробуйте трохи пограти з порядком шляху збірки (я б спробував розмістити бібліотеки раніше). крім того, у мене є ще одне запитання: ви створили клас, який називається "Діяльність", і, можливо, ви його розширили замість класу android?
розробник android

Є 2 бібліотечні проекти, другий (движок) залежить як від simonSays, так і від проекту Android. Я випробував кожну комбінацію порядку збірки, експортуючи проект двигуна від SimonSays. Відповідь на ваше запитання: Я ніде не маю класу під назвою діяльність.
Метью Ретбоун,

двигун - це серцевина. інші проекти повинні використовувати його, а не навпаки. лише проект, який є андроїд-проектом (мається на увазі не бібліотечним проектом), повинен мати маніфест, що включає відмінювання всіх видів діяльності, послуг тощо ... маніфест на андроїд-бібліотечних проектах (на даний момент) не має особливих цілей (див. це для отримання додаткової інформації: stackoverflow.com/a/10445630/878126 )
розробник Android

1
вони повинні мати. просто файл маніфесту може бути дуже коротким і не містити майже нічого. також перевірте файл project.properties (у кожному з проектів), що його цільовий SDK становить 15, оскільки це остання версія на даний момент. якщо ти хочеш, ти можеш повідомити мене, і я виправлю проекти.
розробник android

2

Я щойно переробив додаток у фреймворкову бібліотеку та додаток.

Я не зовсім впевнений, що ви намагаєтесь сказати тут, але той факт, що ви вжили тут слово «реконструйований», змушує мене думати, що ви невірно розумієте концепцію бібліотечного проекту.


Які бібліотеки проектів є :

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

Що не є бібліотечними проектами :

Бібліотечний проект відрізняється від стандартного проекту Android тим, що ви не можете скомпілювати його безпосередньо в один .apkфайл і запустити на пристрої Android. Ви не можете використовувати проекти Android як бібліотечний проект, а потім запропонувати іншому проекту Android розширити проект бібліотеки. Це не працює так.


Тим не менш, я досліджую структуру вашого бібліотечного проекту і переконуюсь, що ви правильно його налаштували . Добре використовувати вашу бібліотеку для зберігання спільного коду / ресурсів, але якщо ваша бібліотека намагається поводитися так, ніби вона є окремою .apkв самому проекті бібліотеки, то ви, мабуть, зробили щось не так. Я вважаю, що ClassNotFoundExceptionбуло б кинуто, якби це було так. Щоб вирішити проблему, я просто будував проект бібліотеки з нуля, а не намагався перетворити проект Android на проект бібліотеки. Це не дозволить вам натрапити на крихітні, надокучливі помилки.

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


Так, я абсолютно правильно ставився до окремих проектів, саме спосіб, яким я посилався на бібліотечні проекти, насправді спричинив проблему. Дякую за чудову допомогу!
Matthew Rathbone

нп ... варто було пострілу, ха-ха
Алекс Локвуд

2

Для Eclipse Kepler (Mac): натисніть проект «Control» -> «Інструменти Android» -> додайте бібліотеку підтримки


Це мені це виправило. включаючи лише 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, яка просто завантажувала so. Щоб знайти свій коментар, знадобилося 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 у шлях до вашого класу .

1

Хоча це не буде застосовним для всіх, нещодавно у мене була ця проблема, оскільки мій проект не зміг зв’язати спільну бібліотеку, присутніх на пристрої. Я забув вказати у своєму маніфесті, що моя заява <uses-library>.



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 годин. Звичайно, оновлення цієї бібліотеки також може бути рішенням. Тож це може бути проблемою версій банку залежностей.


0

Я отримував такий тип помилок, і я намагався все, але не отримав рішення. тоді я зрозумів, чи використовуєте ви бібліотеку як файл aar, тоді вам потрібно додати всі залежності вашої бібліотеки aar до вашого файлу gradle.build. якщо хтось не знайшов рішення, спробуйте це!


-1

Я отримував те саме питання. Але потім я перевірив поточну структуру програми. Я виявив, що у старій структурі програми (я не знаю часу, коли її змінюють розробники фреймворку android) є назва папки, "lib"яка зараз "libs". Я мігрую всі свої файли jar у "libs", і помилка зникла. Сподіваюся, це може комусь допомогти :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.