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
źródło
Odpowiedzi:
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 -> Android
w 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.
źródło
Properties
? Nie mogę go nigdzie znaleźć.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:
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.
źródło
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
.apk
pliku 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 .
.apk
Moż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 przypadkuClassNotFoundException
został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.
źródło
Dla Eclipse Kepler (Mac): kliknij projekt z naciśniętym klawiszem Control -> Narzędzia Android -> dodaj bibliotekę wsparcia
źródło
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:
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:
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 folder
znajduje się w domyślnym folderze wyjściowym, którym jestMyProject/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ą
źródło
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) :)
źródło
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 & Export
i 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
źródło
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>
.źródło
usuń classes.dex z bin i odbuduj projekt
źródło
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.
źródło
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
źródło
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.
źródło
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.
źródło
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!
źródło
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 :)źródło