2012-04-25 14 views
28

Pracuję nad aplikacją, która jest hostem na rynku Android. Czasami (raz w miesiącu) Dostałem raport awarii:Android nie może utworzyć wystąpienia Application java.lang.ClassNotFoundException:

Nie można utworzyć wystąpienia java.lang.ClassNotFoundException aplikacji za

pliki do pobrania aplikacji są między 10,000-50,000. Nie wiem, dlaczego te wyjątki dotyczą nie tylko niektórych urządzeń (testowałem je na 3 różnych urządzeniach, ale nie mogłem ich odtworzyć na końcu).

Czytałem artykuły/sugestie na różnych forach z Androidem dotyczące tego problemu, ale nie udało mi się go rozwiązać. Czy ktoś ma podobny problem: & zasugeruj mi, co mam zrobić?

Uwaga: mam rozszerzenie klasy aplikacji jak ten

public class MyApplication extends Application { 

} 

ją zarejestrować w manifest.xml jak ten

<application android:icon="@drawable/app_icon" 
    android:label="@string/my_app_name" android:name="MyApplication"> 

ślad stosu:

java.lang.RuntimeException: Unable to instantiate application com.xyz.MyApplication  java.lang.ClassNotFoundException: com.xyz.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.xyz-1/pkg.apk] 
at android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:650) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4238) 
at android.app.ActivityThread.access$3000(ActivityThread.java:126) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2076) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4633) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: com.xyz.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.xyz-1/pkg.apk] 
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 
at android.app.Instrumentation.newApplication(Instrumentation.java:942) 
at android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:645) 

Nie wiem, dlaczego awarie aplikacji na niektórych urządzeniach nie wszystkie.

+0

Czy możesz dodać kompletny ślad stosu? –

+0

jaka jest wersja Twojego ADT? – Akram

+0

@Akki ADT wersja jest 12 – junto

Odpowiedz

6

Myślę, że problem jest z getApplication(), które użyłem w 10 różnych miejscach. Użyłem więc wzoru singleton do rozwiązania tego.

public class MyApplication extends Application { 
    private static MyApplication me; 

    @Override 
    public void onCreate() {   
     super.onCreate(); 
     me = this ; 

    } 
    public static MyApplication getInstance() { 
     return me; 
    } 
} 

Teraz użyłem getApplication() jak to

 MyApplication application = MyApplication.getInstance(); 

insted

 MyApplication application = (MyApplication) getApplication(); 

Wysłałem wersji stacjonarnej na rynku & teraz czeka, jeśli nie ma już tego rodzaju awarii. Jeśli wszystko pójdzie idealnie (jeśli nie będzie więcej awarii w ciągu 2 tygodni), to zamknę to pytanie. W międzyczasie każdy ma lepszy pomysł lub zna rozwiązanie, podziel się nim.
Dziękujemy,

+0

Załadowałem nowe wydanie na rynek i od tego czasu nie otrzymałem żadnego raportu o awarii związanego z "Nie można utworzyć wystąpienia java.lang.ClassNotFoundException", więc myślę, że problem został rozwiązany. Jestem bardzo wdzięczny za wszelkie sugestie. – junto

+0

Użyłem tego podejścia od mojej pierwszej wersji, ale wciąż otrzymuję ClassNotFoundException raz lub dwa razy w miesiącu. Jeśli to, co mówisz, powinno mieć awarie z wyjątkiem ClassCast, a nie z ClassNotFound. – Alexey

+1

Tak, pojawia się taki błąd od niewielkiego% użytkowników. Używam metody rzucania, ale nie widzę powodu, dla którego miałoby to znaczenie przy stosowaniu podejścia singleton. Ponieważ zdarza się to małym grupom ludzi, może być trudno dowiedzieć się, kiedy naprawiłeś problem. Czy nie miałeś takich awarii od czasu zmiany podejścia singleton? – Fraggle

0
android:name=".MyApplication" 

także rozważyć dodanie pełnego pakietu

+0

Niestety nie ma miejsca w rzeczywistym kodzie, miejsce było ze względu na edycję tutaj i przepraszam za to. Dziękuję za Twój czas. W mojej poprzedniej kompilacji użyłem pełnej ścieżki pakowania, ale otrzymałem ten sam raport o awarii. – junto

11

Kilka innych podobnych pytań wskazuje, że może to być błąd użytkownika. "/ mnt/asec/..." wskazuje, że aplikacja działa z sdcard. Jeśli sdcard zostanie usunięty, może spowodować ten błąd. Aplikacje innych firm lub zrootowane urządzenia prawdopodobnie przenoszą aplikację na sdcard, nawet jeśli nie jest to dozwolone przez manifest.

Similar Question

+2

Myślę, że to jest prawdziwy rdzeń problemu. moja aplikacja ma obecnie installLocation = "auto". Miałem problemy odkąd zmieniłem z "wewnętrznego". Miał inne problemy z kartą SD, gdzie aplikacja po prostu znika z urządzenia użytkownika. Android zepsuty :( – Fraggle

+0

Zgadzam się ... W moim przypadku błąd został zgłoszony 44 razy dla aktywnych użytkowników 380k. Moja aplikacja ma zainstalowaną lokalizację automatyczną.Jego konkretne urządzenia zgłaszają to DROID Razr, HTC Evo, One, Desire, Sensation, Sony Xperia. Następnie różne Samsungy Galaxy S 2,3,4 i Note. Wszystkie powyższe telefony wydają się mieć kartę micro SD. Co ciekawe, błąd nigdy nie został zgłoszony przez żadnego Nexusa, jednak nie jestem pewien czy "/ mnt/asec/..." wskazuje tylko na kartę microSD, a nie na pamięć USB – petrsyn

1

W moim przypadku było sporządzania i podpisywania z Eclipse ADT (z menu Plik> Eksportuj> Eksportuj aplikacji Android ...), ale brakuje niektórych klas gdybym dekompilować mój apk. Aby rozwiązać problem, używam "Eksportuj niepodpisany plik APK" i podpisuj go przy pomocy jarsignera i zipalign.

+0

Po prostu potrzebowałem ponownie wyeksportować podpisany pakiet Nie musiałem ręcznie używać jarsignera i zipalign. – faizal

Powiązane problemy