背景
不久前,谷歌更改了 Google Play 控制台,以便在发生崩溃时自动报告崩溃,并将其作为他们所谓的“Android Vital”的一部分。
从今天开始,我收到了许多我决定为我的应用程序修复的崩溃报告。
问题
在我修复的一些错误中(还有一个我没有修复的错误,在这里),还有另一个很常见的崩溃,带有这个崩溃日志或类似的:
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 版本和设备,但没有太多关于如何修复它的线索:
我试过的
我发现解决此类崩溃的唯一方法是使用 multi-dex,如此处所述。
看到即使我的应用程序非常小并且几乎不使用第三方库(因此甚至没有接近 64K 方法数),而且在 Android 5.x 及更高版本上甚至不需要多 dex,我仍然很好奇如果这会有所帮助,但在仅仅一天的尝试中,它实际上导致崩溃更频繁地发生:
所以我很快停止使用它,并没有使用它。
问题
- 为什么会发生?
- 有没有办法避免这种情况?避免扩展 Application 类有帮助吗?
- 它对于其他应用程序有多普遍?
- 为什么多重索引实际上会导致更多问题?
- 从用户的角度来看,有这个问题的用户 - 总是有吗?特定设备或 Android 版本是否存在此问题?重新启动应用程序或重新安装它有帮助吗?用户从中获得的具体体验是什么?