2016-03-31 82 views
7

我有一個已發佈的應用程序,可以從用戶那裏獲取有關ClassNotFoundException的報告,這些應用程序超出了我的想法。我一直無法重現此崩潰,此類錯誤的類似實例在SO上有或者是不正確的路徑到MainActivity中的依賴項或不同的包。Android:罕見和不可複製ClassNotFoundException

錯誤的依賴路徑的問題是Eclipse的問題,而所有其他的錯誤可以通過Android Studio的「同步」和「乾淨的項目」(我沒有用)很容易解決。

我已經三重檢查了所有包名,沒有發現任何差異。

這裏是我的清單:

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

以下是錯誤報告,我總是從用戶獲得:

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. 

這似乎是罪魁禍首就是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,但我有沒有發現爲什麼它被某些用戶調用,而不是大多數,更重要的是 - 如何解決它。

+1

這可能與[安裝不成功](http:// stackoverflow。com/questions/36314269/android-app-users-get-installation-unsuccessful-after-introduced-billing-perm)問題基於這樣一句話:'無法刪除過時的文件...權限被拒絕' –

+0

我也是一直認爲可能存在連接,但我認爲安裝程序實際上並未使用清單中定義的權限。 –

+0

您是否曾嘗試在重新安裝前從設備上卸載應用程序? –

回答

3

可能的原因1:行android:largeHeap="true">>中的清單中存在拼寫錯誤。 xml行以>>結尾。這可能會阻止執行Intent-Filter。

可能的原因2:我的猜測是手機正在搜索類<PackageName>.<PackageName>.<ClassName>而不是<PackageName>.<ClassName>。所以肯定<PackageName>.<PackageName>.<ClassName>未找到,並且ClassNotFoundException將是結果。在android studio中,在清單中,默認的活動名稱是這樣寫的:android:name=".<ClassName>"而不是android:name="<PackageName>.<ClassName>"。你可以試試這個。

大多數手機可能正在檢查是否在清單中的類名稱之前添加了packagename。如果添加它,則在搜索該類時不添加它。儘管在搜索課程時默認情況下很少有手機必須添加軟件包名稱。因此,他們找不到你的班級。

+0

我認爲你提到的明顯錯誤的錯字更像是一個問題,而不是你提到的。這是我採用的避免另一個ClassNotFoundException的解決方案。 –

+0

當我嘗試它時,錯字沒有給我一個錯誤。偉大的話請給我賞金 – suku

+0

我認爲你應該在我的其他問題中使用你的答案,http://stackoverflow.com/questions/36314269/android-app-users-get-installation-unsuccessful-after-introducing-billing- perm?lq = 1,因爲儘管您的答案可能是解決此問題的答案,但對於ClassNotFoundException仍然不是一個可靠的解釋。在您的答案發布後,一旦測試人員確認可以再次安裝,我會獎勵您的賞金。如果事實證明它也會導致這個錯誤,你會得到兩個獎勵。 –

0

當然,你的命名錯誤。活動CAN NOT在其名稱屬性中包含該包的名稱。

既然你已經在這裏定義的包名
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.johan.fsc">

你不應該在這裏提及這個名字
<activity android:name="com.johan.fsc.MainActivity"

你應該用類的名字一起使用的軟件包名稱的唯一情況當java類駐留在不同的包中時,如在import語句中所做的那樣。
即使您的活動不在src文件夾中,而是出現在嵌套文件夾中,android studio也應該處理清單和活動本身的鏈接。然而,包名不應該在那裏使用。

+0

絕對不能?該應用程序適用於此配置。不僅如此,這是我通過閱讀另一個帶'ClassNotFoundException'錯誤的問題而採用的方法,因此只是最近的一次更改。它沒有區別,所以我會恢復到默認格式。 –

+0

@JohanZ。這很奇怪.. –