首页 > 解决方案 > Android单用户频繁崩溃

问题描述

我在 Google Play 上看到过高的崩溃率 > 3.5%,但其中超过 99% 是由仅影响一位用户的一次崩溃造成的。这是崩溃:

  java.lang.IllegalStateException: 
  at android.app.SharedPreferencesImpl.awaitLoadedLocked (SharedPreferencesImpl.java:265)
  at android.app.SharedPreferencesImpl.edit (SharedPreferencesImpl.java:349)
  at crc646a240b12c1f538a7.BBarActivity.n_onCreate (Native Method)
  at crc646a240b12c1f538a7.BBarActivity.onCreate (Unknown Source)
  at android.app.Activity.performCreate (Activity.java:7169)
  at android.app.Activity.performCreate (Activity.java:7160)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1272)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3001)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3156)
  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1864)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:205)
  at android.app.ActivityThread.main (ActivityThread.java:6996)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:884)
Caused by: java.lang.OutOfMemoryError: 
  at java.util.Arrays.copyOf (Arrays.java:3260)
  at java.lang.AbstractStringBuilder.ensureCapacityInternal (AbstractStringBuilder.java:125)
  at java.lang.AbstractStringBuilder.append (AbstractStringBuilder.java:605)
  at java.lang.StringBuilder.append (StringBuilder.java:191)
  at org.kxml2.io.KXmlParser.readValue (KXmlParser.java:1454)
  at org.kxml2.io.KXmlParser.next (KXmlParser.java:401)
  at org.kxml2.io.KXmlParser.next (KXmlParser.java:321)
  at com.android.internal.util.XmlUtils.readThisValueXml (XmlUtils.java:1427)
  at com.android.internal.util.XmlUtils.readThisMapXml (XmlUtils.java:830)
  at com.android.internal.util.XmlUtils.readThisValueXml (XmlUtils.java:1481)
  at com.android.internal.util.XmlUtils.readValueXml (XmlUtils.java:1397)
  at com.android.internal.util.XmlUtils.readMapXml (XmlUtils.java:740)
  at android.app.SharedPreferencesImpl.loadFromDisk (SharedPreferencesImpl.java:153)
  at android.app.SharedPreferencesImpl.access$000 (SharedPreferencesImpl.java:54)
  at android.app.SharedPreferencesImpl$1.run (SharedPreferencesImpl.java:122)

阅读上面这似乎是由于内存不足而发生的。由于这只发生在这个用户身上,很难说到底是什么问题,理论上可能是一些存储的偏好变得疯狂并获得了一些令人难以置信的长值,尽管这只是一个理论点,我不明白它是怎么回事可能发生在代码中。他的手机是只有 2 GB 内存的 LGE LG K40,这肯定会有所帮助。最后这发生在主屏幕上,所以它可能是在启动时发生的,并且不知何故他的设备没有为第一次启动释放足够的内存,所以他必须多次启动应用程序直到发生这种情况。这是一个非常频繁的用户,他似乎给该应用程序打了 5 颗星。

问题是这些统计数据可能会影响应用程序的排名,因此当前状态是不可接受的。但我不确定可以做什么。

在访问首选项以最终解决崩溃时,我尝试做一些尝试,但它似乎没有帮助。

我唯一想到的就是在 Google Play 上排除这种特定型号的设备。我认为在这种情况下,用户将无法再接收更新。虽然 Google Play 仍会报告过高的崩溃率,但至少在最新版本上不会发生这种情况,并且可以合理地预期 Google 在对应用程序进行排名时不会计算旧版本应用程序中的崩溃率。

有没有人有类似的情况?有一些编码解决方案吗?或者有什么解决方法可以阻止 Google Play 上出现这种过高的崩溃率报告?

标签: javaandroidcrash

解决方案


他的 SharedPreferences 中显然有一个超长的值。我提供几个想法:

  1. 实施 Firebase Crashlytics。这样一来,您的崩溃就会发生在那里,而 Play 商店甚至都不知道它们。如果此用户的应用只是间歇性崩溃,您甚至可以添加Firebase Log 语句,以便您记录实际在此用户的 SharedPreferences 中的数据。

  2. 在将值保存到 SharedPreferences 之前验证输入,以便截断超过一定长度的文本。为了摆脱任何现有的过长数据,您可以使用getAll()遍历所有键值对并随时截断。如果此特定用户根本无法访问该应用程序,请等到更新发布并要求他清除他的应用程序数据,以便它再次工作。

  3. 如果您经常将大块文本保存到 SharedPreferences,请改用 SQLite。


推荐阅读