3

背景

不久前,谷歌更改了 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,我仍然很好奇如果这会有所帮助,但在仅仅一天的尝试中,它实际上导致崩溃更频繁地发生:

在此处输入图像描述

所以我很快停止使用它,并没有使用它。

问题

  1. 为什么会发生?
  2. 有没有办法避免这种情况?避免扩展 Application 类有帮助吗?
  3. 它对于其他应用程序有多普遍?
  4. 为什么多重索引实际上会导致更多问题?
  5. 从用户的角度来看,有这个问题的用户 - 总是有吗?特定设备或 Android 版本是否存在此问题?重新启动应用程序或重新安装它有帮助吗?用户从中获得的具体体验是什么?
4

2 回答 2

0

如果在您的 gradle 中minify enabled,您还有一个名为app\build\outputs\mapping\release\usage.txt.

在此文件中,您将看到从您的 apk 中删除的所有代码的列表。检查那里是否有您实际需要的任何代码已被 proguard 删除。

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

于 2017-08-23T08:10:17.377 回答
0

通过将这些行添加到我的 Proguard 文件中,我设法减少了它的出现:

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

可以缩短为:

-keep class * extends android.app.Application

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

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

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

于 2017-07-05T17:54:35.653 回答