Android Activity ClassNotFoundException - próbowałem wszystkiego

83

Właśnie refaktoryzowałem aplikację do biblioteki frameworka i aplikacji, ale teraz, gdy próbuję uruchomić aplikację w emulatorze, otrzymuję następujący ślad stosu błędów:

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

Zwykle oznacza to, że plik manifestu jest w jakiś sposób nieprawidłowy, ale dwukrotnie sprawdziłem wszystko, co przychodzi mi do głowy.

Oto moja klasa aktywności:

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;
        }
       };
      }
    }

Jak widać, w manifeście jest poprawnie wymieniony:

<?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>

Nie mam pojęcia, jak to naprawić i byłbym wdzięczny za każdą pomoc. Przeskanowałem wiele podobnych pytań w SO, nie widząc tego konkretnego zachowania.

Więcej informacji:

  • Sprawdziłem wewnątrz wygenerowanego pliku APK i klasa ma wpis w pliku classes.dex
  • Próbowałem wyczyścić / zbudować projekt w zaćmieniu
  • Próbowałem użyć zupełnie nowego obrazu urządzenia, na którym nie ma już kopii pliku APK
  • Zmieniłem projekt biblioteki na zwykłą Javę, a następnie wróciłem do projektu Android, bez różnicy
  • Dodanie abstrakcyjnego SimonSaysActivity do manifestu nie ma znaczenia.
  • Próbowałem uczynić każdą zależność projektem biblioteki Androida i zsynchronizować wersję Androida, której wymagają, nie pomogło

Znalazłem rozwiązanie (patrz poniżej). Do wszystkich, którzy opublikowali odpowiedź / komentarz: Wszyscy dajecie radość, dziękuję za pomoc w rozwiązaniu problemów!

Wygląda na to, że zostało to wprowadzone przez aktualizację narzędzi SDK. Dzięki @Nick poniżej w komentarzach dla tego linku: http://iqadd.com/item/noclassdeffounderror-adt-fix

Matthew Rathbone
źródło
1
Czy Twoja aktywność jest w bibliotece czy aplikacji?
Jeshurun
Jest w aplikacji. Rozszerza podstawową aktywność w projekcie biblioteki.
Matthew Rathbone
Budujesz z mrówką czy z ADT? wydaje się, że pliki dex nie zawierają klas bibliotecznych.
Tomasz Gawel
Ten błąd oznacza, że ​​lokalizacja Twojej aktywności to com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity - najwyraźniej nie w porządku. Spróbuj dodać poziom pakietu do pakietu projektu, który nie istnieje w bibliotece, np. Eastersays.myapp.EasterSimonSaysActivity i określ com.matthewrathbone.eastersays.myapp jako pakiet w manifeście. Ale nie dodawaj poziomu „myapp” do biblioteki, aby ścieżka projektu w manifeście była inna niż ścieżka biblioteki.
Gunnar Karlsson
1
iqadd.com/item/noclassdeffounderror-adt-fix : Link uszkodzony: /
Nishant.

Odpowiedzi:

148

Spędziłem trochę czasu bawiąc się własnym projektem i jestem w stanie odtworzyć twój problem i uzyskać dokładnie ten sam ślad stosu wyjątków podczas próby uruchomienia mojego głównego projektu, więc myślę, że może to być przyczyna:

Tak jak myślałem, chodzi o to, jak odwołujesz się do projektu biblioteki Androida w głównym projekcie Androida, prostych ustawieniach konfiguracji Eclipse.

The Wrong Way:
Kliknij prawym przyciskiem myszy główny projekt, wybierz Properties -> Java Build Path -> Projects -> Add..., to dodaj projekt biblioteki systemu Android jako projekt zależności w ścieżce kompilacji głównego projektu systemu Android, to nie działa. Jeśli wszystkie wymagane zasoby związane z Androidem są zdefiniowane w głównym projekcie, nie otrzymasz żadnego błędu w czasie kompilacji, ale po uruchomieniu aplikacji pojawi się wyjątek opisany w pytaniu.

Właściwy sposób:
Kliknij prawym przyciskiem myszy główny projekt, wybierz Properties -> Androidw sekcji Biblioteka dodaj tutaj swój projekt biblioteki Androida. Sprawdź oficjalny przewodnik dla programistów Odniesienia do projektu biblioteki . To powinno rozwiązać cały problem. Należy również pamiętać, że należy użyć odniesienia do ścieżki względnej do rzeczywistego projektu biblioteki systemu Android, zgodnie z opisem w projekcie bibliotecznym - Zagadnienia dotyczące programowania .

Mam nadzieję że to pomoże.

yorkw
źródło
1
Ty, mój przyjacielu, jesteś geniuszem. Interesujące w tym jest to, że zawsze umieszczałem jedną bibliotekę „w niewłaściwy sposób” i to działało. Kiedy więc przeniosłem się na dwie biblioteki, pomyślałem, że zrobiłem to inaczej. Właśnie zaoszczędziłeś mi wiele godzin pracy.
Matthew Rathbone,
Zabawne jest to, że wcześniej działało, myślę, że aktualizacja narzędzi SDK zmieniła zachowanie. To było bardzo nieoczywiste.
Matthew Rathbone,
3
Tak, aktualizacja narzędzi SDK do> ADT 17 wprowadza ten błąd ze względu na zmianę sposobu, w jaki bieżąca wersja ADT obsługuje biblioteki. Sprawdź: iqadd.com/item/noclassdeffounderror-adt-fix
Nick.
2
Aktualizacja do ADT 22 spowodowała podobny problem: stackoverflow.com/questions/16596969/…
Niels
7
Czy ktoś mógłby mi powiedzieć, gdzie mogę znaleźć Properties? Nie mogę go nigdzie znaleźć.
wesoło
8

Przetestowałem kod, który podałeś i działa dobrze. spróbuj zmienić „extends SimonSaysActivity” na „rozszerza Activity” i przekonaj się, że to działa.

powodem, dla którego to nie działa, jest to, że SimonSaysActivity nie rozszerza Activity (co nie sądzę, że popełniłeś ten błąd) lub kolejność ścieżki budowania jest nieprawidłowa.

aby przejść do kolejności ścieżki budowania, przejdź do:

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

moje podstawowe zamówienie to: src projektu, gen projektu, android 4.0.3, zależności Androida.

ten problem występuje zwykle podczas korzystania z bibliotek.

programista Androida
źródło
Więc masz rację, jeśli bezpośrednio rozszerzę Aktywność, to działa. Moja kolejność kompilacji jest zgodna z Twoją, więc nie mogę znaleźć sposobu, aby to naprawić. Jakieś inne pomysły?
Matthew Rathbone
to naprawdę dziwne. spróbuj zaktualizować sdk & adt. proszę również powiedzieć, czy istnieje wiele projektów bibliotek (lub plików jar lub obu), z których korzysta Twoja aplikacja. jeśli tak, spróbuj trochę pobawić się kolejnością ścieżki budowania (spróbuję umieścić biblioteki wcześniej). dodatkowo mam jeszcze jedno pytanie: czy utworzyłeś klasę o nazwie „Aktywność”, a może rozszerzyłeś ją zamiast androida?
programista Androida
Istnieją 2 projekty bibliotek, drugi (silnik) jest zależny zarówno od simonSays, jak i projektu androida. Wypróbowałem każdą kombinację kolejności kompilacji, eksportując projekt silnika z SimonSays. Odpowiedź na twoje pytanie: nigdzie nie mam zajęć o nazwie aktywność.
Matthew Rathbone
silnik jest rdzeniem. inne projekty powinny go używać, a nie odwrotnie. tylko projekt, który jest projektem na Androida (co oznacza, że ​​nie jest projektem biblioteki) powinien mieć manifest zawierający deklerację wszystkich działań, usług itp ... manifest w projektach bibliotek Androida (obecnie) nie ma wielu celów (zobacz to, aby uzyskać więcej informacji: stackoverflow.com/a/10445630/878126 )
programista Androida
1
oni muszą mieć . po prostu plik manifestu może być bardzo krótki i nie zawierać prawie niczego. sprawdź również plik project.properties (w każdym z projektów), czy docelowy plik SDK to 15, ponieważ jest to obecnie najnowsza wersja. jeśli chcesz, możesz wysłać do mnie wiadomość PM, a ja naprawię projekty.
programista Androida
2

Właśnie refaktoryzowałem aplikację do biblioteki frameworka i aplikacji.

Nie jestem do końca pewien, co próbujesz tutaj powiedzieć, ale fakt, że użyłeś tutaj słowa „refaktoryzowany”, prowadzi mnie do przekonania, że ​​nie rozumiesz koncepcji projektu bibliotecznego.


Jakie projekty bibliotek to :

Projekt biblioteki to projekt programistyczny zawierający udostępniony kod źródłowy i zasoby. Inne projekty systemu Android mogą odwoływać się do projektu biblioteki i dołączać jego skompilowane źródła do swoich plików .apk w czasie kompilacji.

Jakie projekty biblioteczne nie są :

Projekt biblioteki różni się od standardowego projektu systemu Android tym, że nie można go skompilować bezpośrednio do pojedynczego .apkpliku i uruchomić na urządzeniu z systemem Android. Nie możesz użyć projektów systemu Android jako projektu biblioteki, a następnie mieć inny projekt systemu Android, który rozszerzy projekt biblioteki. To nie działa w ten sposób.


To powiedziawszy, zbadałbym strukturę twojego projektu bibliotecznego i upewniłbym się, że skonfigurowałeś go poprawnie . .apkMożesz używać swojej biblioteki do przechowywania współdzielonego kodu / zasobów, ale jeśli twoja biblioteka próbuje zachowywać się tak, jakby była oddzielna w samym projekcie biblioteki, prawdopodobnie zrobiłeś coś złego. Myślę, że w takim przypadku ClassNotFoundExceptionzostałby rzucony. Aby rozwiązać ten problem, po prostu skompilowałbym projekt biblioteki od podstaw, zamiast próbować przekonwertować projekt systemu Android na projekt biblioteki. Dzięki temu nie napotkasz małych, irytujących błędów.

Jeśli nadal masz problemy, wyślij więcej kodu. Powinieneś także bardziej szczegółowo omówić strukturę (i przeznaczenie) swojego projektu bibliotecznego ... dlaczego zdecydowałeś się go użyć, jak go stworzyłeś itp.

Alex Lockwood
źródło
Tak, absolutnie poprawnie traktowałem poszczególne projekty, to sposób, w jaki odnosiłem się do projektów biblioteki, był przyczyną problemu. Jednak dzięki za niesamowitą pomoc!
Matthew Rathbone,
np ... warto było spróbować, haha
Alex Lockwood
2

Dla Eclipse Kepler (Mac): kliknij projekt z naciśniętym klawiszem Control -> Narzędzia Android -> dodaj bibliotekę wsparcia

PSchuette
źródło
To naprawiło to dla mnie. w tym tylko v4-support.jar jako biblioteka nie działała.
Whiteagle
2

Miałem ten problem z projektem, nad którym pracowałem, chociaż mój przypadek był inny. Jeśli ktoś nadal nie może znaleźć rozwiązania swojego problemu, spróbuj sprawdzić to:

W Eclipse:

Project properties -> Java Build Path -> Source tab

Wewnątrz znajdziesz listę ze wszystkimi folderami źródłowymi do skompilowania i umieszczenia w wygenerowanym apku za każdym razem, aby zbudować projekt (i / gen ). Typowo:

>MyProject/gen
>MyProject/src

Będziesz chciał mieć pewność, że w każdym z folderów źródłowych (exclude / gen , więc tylko / src w tym przypadku) element Output folderznajduje się w domyślnym folderze wyjściowym, którym jest MyProject/bin/classes. Zrób to, wybierając folder wyjściowy i klikając Usuń z prawego zestawu przycisków (spowoduje to, że wskaże folder domyślny).

Jeśli nie widzisz podelementu folderu wyjściowego, zaznacz opcję „Zezwalaj na foldery wyjściowe dla folderów źródłowych” tuż pod listą

Gonzalo
źródło
1

Jeśli zastosowałeś się do wszystkich wskazówek (sprawdziłeś prywatne biblioteki itp.) I nadal masz błąd. Sprawdź swój manifest dla tej linii kodu w tagu aplikacji

    android:hasCode="false" 

Usuń to i bądź szczęśliwy. (W końcu byłem) :)

Korona
źródło
Dziękuję bardzo!! Doprowadzało mnie to do szału. To zadziałało dla mnie, miałem manekina MainActivity, który właśnie ładował plik tzw. Znalezienie komentarza zajęło 2 dni!
AdrianTut
1

classNotFoundException w Javie jest podklasą java.lang.Exception i przychodzi, gdy maszyna wirtualna Java próbuje załadować określoną klasę i nie znalazła żądanej klasy w ścieżce klas.

Czytaj więcej: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

Spróbuj przejść do Project -> Properties -> Java Build Path -> Order & Exporti potwierdź, że prywatne biblioteki systemu Android są sprawdzane pod kątem Twojego projektu i wszystkich innych projektów bibliotek, których używasz w aplikacji.

Jak radzić sobie z ClassNotFoundException

  1. Sprawdź, czy nazwa żądanej klasy jest poprawna i czy w ścieżce klas istnieje odpowiedni plik .jar . Jeśli nie, musisz jawnie dodać go do ścieżki klas aplikacji.
  2. W przypadku, gdy określony plik .jar istnieje w Twojej ścieżce klas, ścieżka klas aplikacji jest nadpisywana i musisz znaleźć dokładną ścieżkę klas używaną przez aplikację.
  3. W przypadku, gdy wyjątek jest spowodowany przez klasę strony trzeciej, musisz zidentyfikować klasę, która zgłasza wyjątek, a następnie dodać brakujące pliki .jar do ścieżki klas .
IntelliJ Amiya
źródło
1

Chociaż nie będzie to dotyczyło wszystkich, ostatnio miałem ten problem, ponieważ mój projekt nie mógł połączyć się z udostępnioną biblioteką obecną na urządzeniu. Zapomniałem określić w moim manifeście, że moja aplikacja <uses-library>.

lase
źródło
1

usuń classes.dex z bin i odbuduj projekt

Afzaal Iftikhar
źródło
0

Jakie interfejsy lub klasy nadrzędne używa / rozszerza SimonSaysActivity i czy są one dostępne w używanej wersji Androida? Widziałem podobne problemy, gdy moja aktywność zaimplementowała interfejs API, który nie był dostępny w używanej przeze mnie wersji Androida.

W moim przypadku moja aktywność zaimplementowała interfejs PopupMenu.OnDismissListener, który jest dostępny tylko w API 14, ale kiedy uruchomiłem aplikację na moim urządzeniu 2.3, otrzymałem wyjątek java.lang.NoClassDefFoundError dla tego działania.

Charles Harley
źródło
wszystkie wersje są takie same, Android 2.2.
Matthew Rathbone
0

Miałem ten sam problem i spędziłem większość dnia próbując różnych rzeczy. Aplikacja uruchomiła funkcję znajdowania po wdrożeniu z jednego komputera, ale nie na tym jednym komputerze. W końcu okazało się, że jest to brakująca natura Java! Dziwne, jak pokazało mi ścieżki budowania java, porządkowanie / eksport i wszystko inne, ale jeszcze nie miało natury java. :( Mam nadzieję, że to komuś zaoszczędzi dużo czasu

Łukasz
źródło
0

rozwiązanie dostarczone przez @yorkw jest absolutnie poprawne. Miałem dodatkowy problem, w jednym z plików układu podałem niepoprawnie bezwzględną nazwę. Powinno być

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

raczej to ująłem

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

po ich rozwiązaniu działało dobrze.

Himadri Pant
źródło
0

Wierz lub nie, ale rozwiązaniem dla mnie było usunięcie starej wersji (2.0) biblioteki Google Analytics z mojego projektu, po wypróbowaniu wszystkiego przez co najmniej 4 godziny. Oczywiście aktualizacja tej biblioteki również mogłaby być rozwiązaniem. Więc może to być problem z wersjami jar zależności.

Criss
źródło
0

Otrzymywałem tego typu błąd i próbowałem wszystkiego, ale nie znalazłem rozwiązania. Potem zorientowałem się, że jeśli używasz biblioteki jako pliku aar, musisz dodać wszystkie zależności biblioteki aar do pliku gradle.build aplikacji. jeśli ktoś nie wymyślił rozwiązania, spróbuj tego!

Junaid Bashir
źródło
-1

Otrzymałem ten sam problem. Ale potem sprawdziłem aktualną strukturę aplikacji i stwierdziłem, że starsza struktura aplikacji (nie wiem, kiedy została zmieniona przez programistów platformy Android) ma nazwę folderu, "lib"która jest teraz "libs". Migrowałem wszystkie pliki jar do „libs” i błąd zniknął. Mam nadzieję, że to komuś pomoże :)

kaushal trivedi
źródło