如何在Play Store Vitals中追踪“不可能”的NPE?

问题描述 投票:0回答:1

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

所有这些NPE的根是一个突然不再存在的成员变量对象。不只是一个,但总的来说,强引用所持有的一些对象突然消失了。我不知道应用程序处于什么状态,或者是否是由某个“app killer”应用程序或GC或......引起的

我在Play商店中看到了几个NPE条目“vitals”,有些甚至是我无法访问的android系统文件。我不是初学者,对java / android有很好的理解,这就是为什么这让我很困惑。每个版本我添加越来越多的防护功能,它达到矫枉过正,但每当我检查生命体征时,我看到NPE“新版本x”的旧文件尚未更改,它是一个对象,在那里。

有没有办法找到删除的真正原因?或者对这些例外的一般态度是什么?!

编辑:

我们不是在谈论一个单一的NPE,我们谈论的是SEVERAL,每个发生的事件发生率都低于0.1%(根据游戏商店)整个应用程序包含20多个活动,并且它们在所有测试设备上都运行顺畅这些年。

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

android nullpointerexception crash-reports
1个回答
0
投票

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

不幸的是,没有灵丹妙药解决方案:

  • 我不知道有任何好的(免费)工具来分析代码库来处理线程错误。
  • 使用跟踪打印或调试器查找它们很困难,因为a)这些错误往往难以重现,并且b)这些技术往往会改变程序的行为。
  • 最好的办法是请专家为您查看代码。
  • 或者自己成为一名专家:首先阅读Goetz等人的“Java Concurrency In Practice”。
  • 或者成为一名真正的专家:了解JLS第17章......特别是17.4。

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

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