2016-03-31 8 views
7

Ich habe eine veröffentlichte App, die Berichte über eine ClassNotFoundException von Benutzern, die ich ging über meine Weisheit Ende versucht, zu beheben. Ich war nicht in der Lage, diesen Absturz und ähnliche Instanzen dieses Fehlers hier auf SO zu reproduzieren, waren entweder Fälle von falschem Pfad zu einer Abhängigkeit oder ein anderes Paket in der MainActivity als das Manifest.Android: Seltene und nicht reproduzierbare ClassNotFoundException

Die Probleme mit dem falschen Pfad zu den Abhängigkeiten sind eine Eclipse-Sache, während alle anderen Fehler leicht mit "Sync" und "Clean Project" von Android Studio behoben werden konnten (was ich ohne Erfolg getan habe).

Ich habe alle Paketnamen dreifach überprüft und keine Diskrepanzen gefunden.

Hier ist mein 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> 

Hier ist der Fehlerbericht ich immer von den Benutzern erhalten:

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. 

Es scheinen würde, dass der Täter 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 ist, aber ich habe nicht gefunden, warum es für einige Benutzer aufgerufen wird und nicht die Mehrheit, und noch wichtiger - wie man es beheben kann.

+1

Dies hat möglicherweise etwas mit der [Installation fehlgeschlagen] (http: // stackoverflow.com/questions/36314269/android-app-users-get-installation-erfolglos-nach-einführung-billing-perm) Problem basierend auf der Zeile, die besagt 'Fehler beim Entfernen veraltete Datei ... Berechtigung verweigert ' –

+0

Ich habe auch Ich dachte, dass es eine Verbindung geben könnte, aber ich glaube nicht, dass das Installationsprogramm tatsächlich die im Manifest definierten Berechtigungen verwendet. –

+0

Haben Sie vor der Neuinstallation versucht, die App von einem Gerät zu deinstallieren? –

Antwort

3

Mögliche Ursache 1: Im Manifest befindet sich ein Tippfehler in der Zeile android:largeHeap="true">>. XML-Zeile endet mit >>. Dies kann verhindern, dass der Intent-Filter ausgeführt wird.

Mögliche Ursache 2: Meine Vermutung ist, dass das Telefon nach einer Klasse <PackageName>.<PackageName>.<ClassName> statt <PackageName>.<ClassName> sucht. Also definitiv <PackageName>.<PackageName>.<ClassName> wird nicht gefunden und ClassNotFoundException wäre das Ergebnis. In Android Studio, im Manifest, ist der Name der Aktivität standardmäßig wie folgt geschrieben: android:name=".<ClassName>" anstelle von android:name="<PackageName>.<ClassName>". Sie können dies versuchen.

Die meisten Telefone überprüfen möglicherweise, ob Paketname vor dem Klassennamen im Manifest hinzugefügt wird. Wenn es hinzugefügt wird, fügen sie es nicht während der Suche der Klasse hinzu. Während einige Telefone den Paketnamen standardmäßig bei der Suche nach der Klasse hinzufügen müssen. Daher können sie Ihre Klasse nicht finden.

+0

Ich denke, es ist eher ein Problem mit dem grellen, fehlerlosen Tippfehler, den Sie eher erwähnen als dies. Dies war eine Lösung, die ich einführte, um eine weitere ClassNotFoundException zu vermeiden. –

+0

Dieser Tippfehler gab mir keinen Fehler, als ich es versuchte. Großartig dann bitte geben Sie mir die Prämie – suku

+0

Ich denke, Sie sollten Ihre Antwort in meiner anderen Frage verwenden, http://stackoverflow.com/questions/36314269/android-app-users-get-installation-unsuccessful-after-introducing-billing- perm? lq = 1, denn während Ihre Antwort die Lösung sein kann, die sie behebt, ist sie immer noch keine solide Erklärung für die ClassNotFoundException. Veröffentlichen Sie Ihre Antwort dort und ich werde Ihnen das Kopfgeld erstatten, sobald die Tester bestätigen, dass es wieder installiert werden kann. Wenn sich herausstellt, dass dies ebenfalls zu diesem Fehler führt, erhalten Sie beide Kopfgelder. –

0

Sicher, Sie benennen Ihre Aktivität falsch. Eine Aktivität CAN NOT besteht aus dem Namen des Pakets in seinem Namensattribut.

Da Sie bereits die Paketnamen hier definieren
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.johan.fsc">

Sie sollen diese Namen nicht nennen hier
<activity android:name="com.johan.fsc.MainActivity"

Die einzige Situation, die Sie Paket Namen zusammen mit einer Klasse verwenden sollen Name ist wenn die Java-Klasse in einem anderen Paket residiert, wie in import Anweisungen getan.
Auch wenn Ihre Aktivität nicht im Ordner src vorhanden ist und stattdessen in einem verschachtelten Ordner vorhanden ist, sollte Android Studio die Verknüpfung von Manifest und der Aktivität selbst behandeln. Auch hier sollte der Paketname nicht verwendet werden.

+0

Absolut nicht? Die App funktioniert mit dieser Konfiguration. Nicht nur das, es ist eine Methode, die ich aus dem Lesen einer anderen Frage mit dem 'ClassNotFoundException'-Fehler übernommen habe, also nur eine kürzliche Änderung. Es machte keinen Unterschied, also werde ich zum Standardformat zurückkehren. –

+0

@JohanZ. Nun, das ist seltsam. –

Verwandte Themen