2017-05-31 155 views
6

此崩潰發生在我們的應用程序的1800名用戶,每月有1.2個活躍用戶(根據Google Developer Console)。 相當罕見,但它發生。BaseDexClassLoader發生意外崩潰

Android 4.1多達6個,但沒有Android 7的報告。

BaseDexClassLoader中此ClassNotFoundException的性質可能是什麼。 我們可以避免它嗎?

了java.lang.RuntimeException: 在android.app.LoadedApk.makeApplication(LoadedApk.java:572)在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4831) 在android.app。 ActivityThread.access $ 1500(ActivityThread.java:178)
在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1531)
在android.os.Handler.dispatchMessage(Handler.java:111)在 android.os.Looper.loop(Looper.java:194)at android.app.ActivityThread.main(ActivityThread.java:5637)at java。 lang.reflect.Method.invoke(Method.java:0)at java.lang.reflect.Method.invoke(Method.java:372)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit。的java:959) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)

引起:拋出java.lang.ClassNotFoundException:在 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.newApplication(Instrumentation.java:985 )
at android.app.LoadedApk.makeApplication(Loaded Apk.java:567)

+1

https://stackoverflow.com/questions/15686593/java-lang-classnotfoundexception-in-dalvik-system-basedexclassloader-findclass –

+1

發表您的gradle這個文件,如果可能的話 –

+1

你的清單有其監聽連接更改還是可以由系統自動啓動的連接更改? – MatPag

回答

6

注:下面的答案可能是不準確的,無法驗證, 因爲這樣的例外是相當impossibile在測試 環境模擬。如果有人有關於該主題的更多信息或者可能是最終解決方案,請在此處發佈。 我提前道歉,如果這個信息將被證明是假的,在所有的,但它們都是基於我的

有在Android中java.lang.ClassNotFoundException的多個變體,其中大部分是由引起的事經驗和體會一個錯誤的Proguard配置,IDE不能正確關閉在構建時間等設備的上一個啓動的實例...

所有這個「正常」ClassNotFoundException s是可區分的,因爲在某些例外的部分有一些與應用本身就像:

java.lang.RuntimeException: Unable to instantiate application com.my.package.CustomApplication: java.lang.NullPointerException 

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.package/com.my.package.MyClass}: java.lang.ClassNotFoundException: Didn't find class "com.my.package.MyClass" on path: DexPathList[[zip file "/data/app/com.my.package-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.my.package-1, /vendor/lib, /system/lib]] 

當你面臨的一個什麼東西都沒有關係與你的應用程序,因爲很顯然也有你的應用程序組件的引用。這是系統加載APK時的一個錯誤,並且當您的應用程序由於更新而被卸載並重新安裝時,嘗試執行一些代碼(如Receiver)。

什麼,我認爲它的發生在這裏:

  1. 安裝該應用程序
  2. 系統要啓動組件之一(例如<receiver>
  3. 的應用被卸載,因爲的新更新(此步驟應該只持續幾秒鐘)
  4. 系統無法找到您的應用並拋出您發佈的錯誤
  5. 更新安裝和您的應用程序重新開始

工作的因素,這樣的組合可以解釋爲什麼你只有「少數」考慮總活躍用戶崩潰。

你能做些什麼呢?我認爲沒有什麼,因爲這是系統處理這種特殊情況的一個錯誤。 This comment中的多個相關問題之一具有相同的結論。

您可以嘗試創建自定義ClassLoader,您可以在其中自行處理異常,並在不使應用程序崩潰的情況下終止應用程序進程,這樣用戶不應該注意任何事情(我不知道用戶是否是真的注意到這一點,也許這是一個由系統處理的內部異常,並且用戶沒有看到任何東西)

事實上,你沒有遇到Android 7的報告可能是一個跡象,他們解決了最新的問題Android版LoadedApk

PS:我真的不認爲這與多重分解有關,但是您可以執行一些測試t Ø一定

+1

哇,只是哇。謝謝你這篇精彩的文章。 這一切都有道理。 我接受了答案。 – Pavel

+0

似乎合理。 – adarsh

+0

雖然有些事情沒有解釋 - 如果解釋是正確的,我們早些時候會看到更多的這些錯誤,並且很多google-play-apps都會受到影響。之前在stackoverflow中缺少這個問題,以及最近我也開始看到這個問題的事實仍然沒有解釋。 – adarsh