【问题标题】:How do i track down "impossible" NPEs in Play Store Vitals?如何在 Play Store Vitals 中追踪“不可能”的 NPE?
【发布时间】:2019-04-29 10:58:17
【问题描述】:

我有一个应用程序多年来安装量很大,而且似乎总会有 NPE,无论我做什么。

所有这些 NPE 的根源是一个突然不再存在的成员变量对象。不仅是一个,而且一般来说,强引用所持有的某些对象突然消失了。我不知道应用程序处于什么状态,或者它是否由某些“应用程序杀手”应用程序或 GC 或......

我在 play store “vitals”中看到了其中一些 NPE 条目,有些甚至在我无法访问的 android 系统文件中。我不是初学者,并且对 java/android 有很好的理解,这就是为什么这让我如此困惑。每个版本我都添加了越来越多的保护功能,它达到了矫枉过正,但每次当我检查生命体征时,我都会看到一个未更改的旧文件的 NPE“版本 x 中的新内容”,它是一个必须在那里。

有什么方法可以查出删除的真正原因吗?或者对这些例外的普遍态度是什么?!

编辑:

我们不是在谈论一个单一的 NPE,而是在谈论几个,在整个应用程序中,每个 NPE 的发生率都低于 0.1%(根据 Play 商店),其中包含 20 多个活动,并且在所有活动中都运行顺利多年来测试设备。

我认为它发生在各种边缘情况下,例如应用程序在后台运行数周或在后台内存不足等,但它没有告诉我它何时发生(在 Play 商店条目中)

【问题讨论】:

  • 您能否提供指示崩溃行的易出错代码块?

标签: android nullpointerexception crash-reports


【解决方案1】:

这类问题通常是由线程错误引起的。两个或多个线程在没有充分同步的情况下共享可变对象或变量。这可能导致竞争条件,或者由于线程在内存读取上看到陈旧值而导致的更隐蔽的问题。 (阅读 Java 内存模型。)

不幸的是,没有灵丹妙药解决这个问题:

  • 我不知道有什么好的(免费)工具可以用来分析代码库中的线程错误。

  • 使用跟踪打印或调试器很难找到它们,因为 a) 这些错误往往难以重现,b) 这些技术往往会改变程序的行为。

  • 最好的办法是请专家为您查看代码。

  • 或者自己成为专家:从阅读 Goetz 等人的“Java Concurrency In Practice”开始。

  • 或者成为真正的专家:了解 JLS 第 17 章...尤其是 17.4。

避免此类问题的最佳方法是:

  • 全面了解 Java 线程和同步,
  • 彻底了解您正在使用的框架/平台(例如 Android 应用框架)的线程安全要求,
  • 避免编写自己的并发代码:更喜欢java.util.concurrency.* 提供的更高级别的类,并且
  • 广泛的自动化测试。

【讨论】:

  • 你怎么知道的?
  • 所涉及的类不是以线程方式使用的,只是常规活动及其对象
  • 那么这是一个什么样的应用程序呢?您是否知道大多数(如果不是全部)Android 应用程序都是隐式多线程的?你读过developer.android.com/guide/components/processes-and-threads 吗?
  • 如果两个或多个系统线程共享我的活动对象,那么活动成员变量如何被清空?
  • 由于一个线程看到了一个陈旧的值;看我回答的第一段! (看到null的线程可能看到了一些已经初始化的变量的值,但是初始化的结果还没有刷到主存。例如。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2020-02-05
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多