为什么我的应用程序上有ClassNotFoundException?

时间:2017-06-05 19:08:31

标签: android classnotfoundexception multidex android-application-class

背景

不久前,Google已经更改了Google Play控制台,因此崩溃会在发生时自动报告,并将其作为所谓的“Android Vital”的一部分。

从那天起,我收到了很多崩溃报告,我已经决定为my app修复。

问题

在我修复过的一些错误中(还有一个我没有修复过的错误,here),还有另一个非常常见的崩溃,有这个崩溃日志或类似的错误:

java.lang.RuntimeException: 
  at android.app.LoadedApk.makeApplication(LoadedApk.java:572)
  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4768)
  at android.app.ActivityThread.access$1500(ActivityThread.java:176)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1498)
  at android.os.Handler.dispatchMessage(Handler.java:111)
  at android.os.Looper.loop(Looper.java:194)
  at android.app.ActivityThread.main(ActivityThread.java:5576)
  at java.lang.reflect.Method.invoke(Native Method:0)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
Caused by: java.lang.ClassNotFoundException: 
  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.newApplication(Instrumentation.java:984)
  at android.app.LoadedApk.makeApplication(LoadedApk.java:567)

这次崩溃似乎影响了各种Android版本和设备,但关于如何修复它的线索并不多:

enter image description here

我尝试了什么

我发现解决此类崩溃的唯一方法是使用multi-dex,如here所示。

即使我的应用程序非常小并且几乎不使用第三方库(因此甚至没有接近64K方法计数),并且Android 5.x及更高版本甚至不需要多dex,我仍然很好奇,如果这会有所帮助,但在尝试它的一天,它实际上导致崩溃更频繁发生:

enter image description here

所以我很快停止使用它,然后又回来了,没有使用它。

问题

  1. 为什么会这样?
  2. 有什么方法可以避免这种情况吗?将避免扩展Application类有用吗?
  3. 其他应用程序有多常见?
  4. 为什么多dexing实际上会引起更多问题呢?
  5. 从用户的角度来看,有这个问题的用户 - 总是拥有它吗?特定设备或Android版本是否存在此问题?重新启动应用程序或重新安装它有帮助吗?用户从中获得的体验究竟是什么?

2 个答案:

答案 0 :(得分:0)

我设法通过将这些行添加到我的Proguard文件来减少它的出现次数:

-keep class android.app.Application
-keep class <<MyPackage>>.MyApplication

可缩短为:

-keep class * extends android.app.Application

根据android源代码,我想它修复了第一个问题。

我还将所有的lib更新到了应该修复第二个版本的最新版本(Google Play Services 11.0.2,支持lib 25.4.0)。

更新:它不能完全解决问题。我的出现次数要少得多,但仍然有一些。

答案 1 :(得分:0)

如果你的gradle里面有minify enabled,你还有一个名为app\build\outputs\mapping\release\usage.txt的文件。

在此文件中,您将看到apk中所有已剥离代码的列表。检查是否有任何您真正需要的代码已被proguard删除。

如果您在那里找到任何所需的代码,那么您必须在proguard配置文件中添加说明以保留它们。