2016-03-31 14 views
7

Mam opublikowaną aplikację, która otrzymuje raporty o ClassNotFoundException od użytkowników, że wyszedłem poza moje sprytu koniec próbuje naprawić. Nie udało mi się odtworzyć tego błędu, a podobne przypadki tego błędu w tym miejscu na SO były przypadkami nieprawidłowej ścieżki do zależności lub inną paczką w pliku MainActivity niż w manifeście.Android: Rzadkie i nieproduktywne ClassNotFoundException

Problemy z niewłaściwą ścieżką do zależności to rzecz Eclipse, a wszystkie inne błędy można łatwo naprawić za pomocą "synchronizacji" Androida Studio i "czystego projektu" (co bez skutku).

Trzykrotnie sprawdziłem wszystkie nazwy paczek i nie stwierdziłem żadnych rozbieżności.

Tu jest mój manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.johan.fsc"> 

    <uses-permission android:name = "android.permission.VIBRATE"/> 
    <uses-permission android:name="com.android.vending.BILLING" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/logo" 
     android:label="@string/app_name" 
     android:fullBackupContent="true"> 
     <activity 
      android:name="com.johan.fsc.MainActivity" 
      android:screenOrientation="portrait" 
      android:label="@string/app_name" 
      android:theme="@style/splashscreenTheme" 
      android:hardwareAccelerated="false" 
      android:largeHeap="true">> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <activity android:name = "com.johan.fsc.SettingsActivity" 
      android:theme="@style/PreferencesTheme"/> 
    </application> 

Oto raport o błędzie zawsze uzyskać od użytkowników:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.johan.fsc/com.johan.fsc.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.johan.fsc.MainActivity" on path: DexPathList[[zip file "/data/app/com.johan.fsc-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2595) 
    at android.app.ActivityThread.access$800(ActivityThread.java:178) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470) 
    at android.os.Handler.dispatchMessage(Handler.java:111) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5624) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.johan.fsc.MainActivity" on path: DexPathList[[zip file "/data/app/com.johan.fsc-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1071) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
    ... 10 more 
    Suppressed: java.io.IOException: Failed to open oat file from dex location '/data/app/com.johan.fsc-1/base.apk' 
     at dalvik.system.DexFile.openDexFileNative(Native Method) 
     at dalvik.system.DexFile.openDexFile(DexFile.java:295) 
     at dalvik.system.DexFile.<init>(DexFile.java:80) 
     at dalvik.system.DexFile.<init>(DexFile.java:59) 
     at dalvik.system.DexPathList.loadDexFile(DexPathList.java:262) 
     at dalvik.system.DexPathList.makeDexElements(DexPathList.java:231) 
     at dalvik.system.DexPathList.<init>(DexPathList.java:109) 
     at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48) 
     at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:65) 
     at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:57) 
     at android.app.LoadedApk.getClassLoader(LoadedApk.java:370) 
     at android.app.LoadedApk.makeApplication(LoadedApk.java:562) 
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4818) 
     at android.app.ActivityThread.access$1500(ActivityThread.java:178) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1531) 
     ... 7 more 
Caused by: java.io.IOException: Failed to open oat file from /data/app/com.johan.fsc-1/arm/base.odex (error Failed to open oat filename for reading: No such file or directory) (no dalvik_cache availible) and relocation failed. 
     ... 22 more 
Caused by: java.io.IOException: 
     ... 22 more 
Caused by: java.io.IOException: Failed to remove obsolete file from /data/dalvik-cache/arm/[email protected]@[email protected]@classes.dex when searching for dex file /data/app/com.johan.fsc-1/base.apk: Permission denied 
     ... 22 more 
    Suppressed: java.lang.ClassNotFoundException: com.johan.fsc.MainActivity 
     at java.lang.Class.classForName(Native Method) 
     at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 
     at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 
     ... 13 more 
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available/output. 

Wydaje się, że winowajcą jest java.io.IOException: Failed to remove obsolete file from /data/dalvik-cache/arm/[email protected]@[email protected]@classes.dex when searching for dex file /data/app/com.johan.fsc-1/base.apk: Permission denied, ale mam nie znaleziono przyczyny, dla której jest wywoływana dla niektórych użytkowników, a nie dla większości, a co ważniejsze - jak to naprawić.

+1

Może to mieć coś wspólnego z [Instalacja nie powiodła się] (http: // stackoverflow.com/questions/36314269/android-app-users-get-installation-unsuccessful-after-introducing-billing-perm) problem oparty na linii, która mówi: "Nie można usunąć przestarzałego pliku ... Odmowa uprawnień" –

+0

Mam również Myślałem, że może istnieć połączenie, ale nie sądziłem, że instalator faktycznie używa uprawnień zdefiniowanych w manifeście. –

+0

Czy próbowałeś odinstalować aplikację z urządzenia przed ponownym zainstalowaniem? –

Odpowiedz

3

Możliwa przyczyna 1: W manifeście występuje literówka w wierszu android:largeHeap="true">>. Linia xml kończy się na >>. Może to uniemożliwić wykonanie filtru intencji.

Możliwa przyczyna 2: Domyślam się, że telefon szuka klasy <PackageName>.<PackageName>.<ClassName> zamiast <PackageName>.<ClassName>. Więc zdecydowanie nie znaleziono <PackageName>.<PackageName>.<ClassName> i wynik klasy ClassNotFoundException. W Androidzie w manifeście domyślnie nazwa działania jest zapisana następująco: android:name=".<ClassName>" zamiast android:name="<PackageName>.<ClassName>". Możesz spróbować.

Większość telefonów może sprawdzać, czy nazwa opakowania jest dodana przed nazwą klasy w manifeście. Jeśli zostanie dodany, nie dodaje go podczas wyszukiwania klasy. Podczas gdy kilka telefonów musi domyślnie dodawać nazwę pakietu podczas wyszukiwania klasy. Dlatego nie mogą znaleźć twojej klasy.

+0

Myślę, że to bardziej problem z rażącym, mniejszym błędem, o którym wspomniałeś, a nie tym. To było rozwiązanie, które zastosowałem, aby uniknąć kolejnego wyjątku ClassNotFoundException. –

+0

Ta literówka nie dała mi błędu, gdy próbowałem. Wspaniale, proszę, obdaruj mnie nagrodą – suku

+0

Myślę, że powinieneś użyć swojej odpowiedzi w moim drugim pytaniu, http://stackoverflow.com/questions/36314269/android-app-users-get-installation-unsuccessful- after-inititting-billing- perm? lq = 1, ponieważ podczas gdy twoja odpowiedź może być tą, która naprawia to, to wciąż nie jest solidnym wyjaśnieniem wyjątku ClassNotFoundException. Opublikuj tam swoją odpowiedź, a ja nagrodzę cię nagrodą, gdy testerzy potwierdzą, że można ją zainstalować ponownie. Jeśli się okaże, spowoduje to również TEN błąd, dostaniesz obie nagrody. –

0

Z pewnością nazywasz swoją działalność nieprawidłowo. Działanie CAN NOT zawiera nazwę pakietu w jego nazwie.

Skoro jesteś już definiowania nazwę pakietu tutaj
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.johan.fsc">

Nie należy wspomnieć, że nazwa tutaj
<activity android:name="com.johan.fsc.MainActivity"

jedyna sytuacja, należy użyć nazwy pakietu wraz z nazwa klasa jest gdy klasa java znajduje się w innym pakiecie, jak w instrukcjach import.
Nawet jeśli twoja aktywność nie jest obecna w folderze src i zamiast tego jest obecna w folderze zagnieżdżonym, studio android powinno obsługiwać połączenie manifestu i samego działania. Jeszcze raz nazwa pakietu nie powinna być tam używana.

+0

Absolutnie nie? Aplikacja działa z tą konfiguracją. Co więcej, jest to metoda, którą zaadaptowałem, czytając inne pytanie z błędem "ClassNotFoundException", a więc tylko ostatnią zmianę. Nie robiło to różnicy, więc powrócę do domyślnego formatu. –

+0

@JohanZ. cóż, to dziwne ... –

Powiązane problemy