2016-03-31 16 views
7

Ho un'app pubblicata che riceve segnalazioni su uno ClassNotFoundException da utenti che sono andato oltre il mio ingegno e ho cercato di risolvere. Non sono stato in grado di riprodurre questo arresto anomalo e simili istanze di questo errore qui su SO sono stati casi di percorso errato a una dipendenza o un diverso pacchetto nello MainActivity rispetto al manifest.Android: Rare e non riproducibile ClassNotFoundException

I problemi con il percorso sbagliato delle dipendenze sono una cosa di Eclipse, mentre tutti gli altri errori potrebbero essere facilmente risolti con "sync" e "clean project" di Android Studio (cosa che non ho fatto).

Ho triplicato controllato tutti i nomi dei pacchetti e non ho trovato alcuna discrepanza.

Ecco il mio manifesto:

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

Ecco il rapporto di errore ottengo sempre da parte degli utenti:

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. 

sembrerebbe che il colpevole è 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, ma ho non è stato trovato il motivo per cui è stato invocato per alcuni utenti e non la maggioranza e, cosa più importante, come risolverlo.

+1

Questo potrebbe avere qualcosa a che fare con [Installazione non riuscita] (http: // StackOverflow.it/questions/36314269/android-app-users-get-installazione-infruttuoso-dopo-introduzione-fatturazione-perm) problema basato sulla riga che dice 'Impossibile rimuovere il file obsoleto ... Autorizzazione negata' –

+0

Ho anche pensavo che potesse esserci una connessione, ma non pensavo che l'installer usasse effettivamente le autorizzazioni definite nel manifest. –

+0

Hai provato a disinstallare l'app da un dispositivo prima di reinstallarlo? –

risposta

3

Possibile causa 1: C'è un errore di battitura nel manifest nella riga android:largeHeap="true">>. la linea xml termina con >>. Questo potrebbe impedire l'esecuzione del filtro Intent.

Possibile causa 2: La mia ipotesi è che il telefono stia cercando una classe <PackageName>.<PackageName>.<ClassName> anziché <PackageName>.<ClassName>. Quindi sicuramente <PackageName>.<PackageName>.<ClassName> non viene trovato e ClassNotFoundException sarebbe il risultato. In Android Studio, nel manifest, per impostazione predefinita, il nome dell'attività è scritto in questo modo: android:name=".<ClassName>" anziché android:name="<PackageName>.<ClassName>". Puoi fare un tentativo.

La maggior parte dei telefoni potrebbe verificare se il nome del pacchetto è stato aggiunto prima del nome della classe nel file manifest. Se viene aggiunto, non lo aggiungono durante la ricerca della classe. Mentre alcuni telefoni devono aggiungere il nome del pacchetto per impostazione predefinita durante la ricerca della classe. Quindi, non riescono a trovare la tua classe.

+0

Penso che sia più un problema con l'errore di battitura, errore di battitura che si menziona piuttosto che questo. Questa è stata una soluzione che ho adottato per evitare un'altra ClassNotFoundException. –

+0

Questo errore non mi ha dato alcun errore quando l'ho provato. Bene, per favore assegnami la taglia – suku

+0

Penso che dovresti usare la tua risposta nella mia altra domanda, http://stackoverflow.com/questions/36314269/android-app-users-get-installation-unsuccessful-after-introducing-billing- perm? lq = 1, perché mentre la tua risposta potrebbe essere quella che lo risolve, non è ancora una spiegazione solida per ClassNotFoundException. Pubblica la tua risposta lì e ti ricompenserò la taglia una volta che i tester confermeranno che può essere nuovamente installata. Se si scopre che causa anche questo errore, otterrai entrambe le ricompense. –

0

Certo, stai nominando la tua attività sbagliata. Un'attività NON PUO essere il nome del pacchetto nel suo attributo nome.

Dal momento che si sta già definendo il nome del pacchetto qui
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.johan.fsc">

Non si dovrebbe parlare di quel nome qui
<activity android:name="com.johan.fsc.MainActivity"

L'unica situazione si dovrebbe usare nome del pacchetto insieme al nome di una classe è quando la classe java risiede in un pacchetto diverso, come fatto nelle istruzioni import.
Anche se l'attività non è presente nella cartella src ed è invece presente in una cartella nidificata, Android Studio deve gestire il collegamento di manifest e l'attività stessa. Ancora una volta, il nome del pacchetto non dovrebbe essere usato lì.

+0

Assolutamente no? L'app funziona con questa configurazione. Non solo, è un metodo che ho adottato leggendo un'altra domanda con l'errore 'ClassNotFoundException', quindi solo una modifica recente. Non ha fatto alcuna differenza, quindi tornerò al formato predefinito. –

+0

@JohanZ. bene questo è strano .. –

Problemi correlati