2016-03-31 16 views
7

Düzeltmeye çalıştığım zamanın ötesine geçtiğim kullanıcılardan bir ClassNotFoundException hakkında raporlar alan bir yayınlanmış uygulamam var. Bu çarpışmanın ve bu hataya benzer örneklerin çoğunu yeniden üretemedim, ya SO yanıtı ya da bağımlılık için yanlış yol durumu ya da bildirimden MainActivity'daki farklı bir paket oldu.Android: Nadir ve Yeniden Üretilemez ClassNotFoundException

Bağımlılıkların yanlış yolu ile ilgili sorunlar, bir Eclipse olayıdır; diğer tüm hatalar, Android Studio'nun "eşitleme" ve "temiz proje" ile (ki boşuna yaptığım) kolayca giderilebilir.

Tüm paket adlarını üç kez kontrol ettim ve herhangi bir uyuşmazlık bulamadım.

<?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> 
İşte

Hep kullanıcılardan elde hata raporu: Burada

benim tezahür

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. 

O suçlu 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 olduğu gibi görünüyor, ama ben bazı kullanıcılar için neden çalıştırıldığını ve çoğunluğu değil, daha da önemlisi bunu nasıl düzelteceğimizi bulamadı.

+1

Bu, [Installation Başarısız] (http: // stackoverflow) ile ilgili bir şey olabilir.com/questions/36314269/android-app-users-get-installation-fail-after-introduging-billing-perm) ile ilgili sorunlara dayanarak 'eski dosyayı kaldıramaz' ... İzinsiz reddedildi –

+0

bir bağlantı olabileceğini düşünüyordum, ancak yükleyicinin bildiride tanımlanan izinleri kullanacağını düşünmedim. –

+0

Yeniden yüklemeden önce uygulamayı bir cihazdan kaldırmayı denediniz mi? –

cevap

3

Muhtemel Neden 1: android:largeHeap="true">> hattındaki bildiride bir yazım hatası var. xml satırı, >> ile biter. Bu, Amaç Filtresinin yürütülmesini engelliyor olabilir.

Muhtemel Neden 2: Tahminim, telefonun <PackageName>.<ClassName> yerine <PackageName>.<PackageName>.<ClassName> sınıfını aradığıdır. Yani kesinlikle <PackageName>.<PackageName>.<ClassName> bulunamadı ve ClassNotFoundException sonuç olur. Android stüdyosunda, bildiride, varsayılan etkinlik adı şu şekilde yazılmıştır:yerine android:name=".<ClassName>". Bunu deneyebilirsin.

Çoğu telefon, manifestodaki sınıf adından önce paketin eklenmiş olup olmadığını kontrol ediyor olabilir. Eğer eklenirse, sınıfı ararken bunu eklemezler. Sınıfı ararken birkaç telefonun paket adını varsayılan olarak eklemesi gerekir. Böylece sınıfınızı bulamıyorlar.

+0

Sanırım bunun yerine bahsettiğiniz göze çarpan, hatasız yazım hatasıyla ilgili bir sorun. Bu henüz bir başka ClassNotFoundException önlemek için benim bir çözüm oldu. –

+0

Bu yazım hatası denediğimde bana bir hata vermedi. Öyleyse lütfen bana lütfunu verin – suku

+0

Bence cevabınızı diğer soruma göre kullanmalısınız, http://stackoverflow.com/questions/36314269/android-app-users-get-installation-unsuccessful-after-introducing-billing- perm? lq = 1, çünkü cevabınız bunu düzeltebilirken, ClassNotFoundException için hala sağlam bir açıklama değildir. Cevabınızı oraya gönderin ve test edicilerin tekrar kurulabildiğini onaylayınca size ödül vereceğim. Eğer ortaya çıkarsa, bu da hataya neden olur, her iki ödülü de alırsınız. –

0

Şüphesiz, etkinliğinizi yanlış adlandıracaksınız. Bir etkinlik AKTİF DEĞİL, paketin adını ad özelliğinde içerir.

Zaten burada
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.johan.fsc">

paket adı tanımlarken yana Burada bu ismi
<activity android:name="com.johan.fsc.MainActivity"

Bir sınıfın adıdır birlikte paket adı kullanmanız gereken tek durum söz olmamalı java sınıfı, import ifadelerinde yapıldığı gibi farklı bir pakette bulunduğunda.
Etkinliğiniz src klasöründe bulunmasa ve bunun yerine iç içe geçmiş bir klasörde mevcutsa bile, android stüdyosunun manifest ve linkin kendisi ile bağlantı kurması gerekir. Yine yine, paket adı burada kullanılmamalıdır.

+0

Kesinlikle yapamaz mıyız? Uygulama bu yapılandırma ile çalışır. Sadece bu değil, 'ClassNotFoundException' hatasıyla başka bir soru okumadan benimsediğim bir yöntem, bu yüzden sadece son bir değişiklik. Fark yaratmadı, bu yüzden varsayılan formata döneceğim. –

+0

@JohanZ. peki bu garip .. –

İlgili konular