Sentry android ANR,会不会误报?

Sentry android ANR, could there be a false alarm?

我正在使用 Sentry-Android 2.3.0 SDK 来收集 android 崩溃和 ANR,在过去的几个月里,出现了几个奇怪的 ANR。所有这些都发生在用户一段时间后打开设备时,所有这些都发生在 MessageQueue.next 方法中。在深入挖掘了Sentry SDK源码后,发现Android中处理ANR的核心逻辑在classANRWatchDog.java中,恕我直言,可以简化如下:

public class Test {
  BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();

  class MainThread extends Thread {

    public void run() {
      while (!isInterrupted()) {
        Runnable r;
        try {
          r = queue.take();
        } catch (InterruptedException e) { return; }
        r.run();
      }
    }
  }

  class WorkerThread extends Thread {
    private AtomicLong tick = new AtomicLong(0);
    private AtomicBoolean reported = new AtomicBoolean(false);

    private final Runnable ticker = new Runnable() {
      public void run() {
        tick = new AtomicLong(0);
        reported.set(false);
      }
    };

    public void run() {
      while (!isInterrupted()) {
        boolean needPost = tick.get() == 0;
        tick.addAndGet(100L);
        if (needPost) {
          queue.add(ticker);
        }
        try {
          Thread.sleep(100L);
        } catch (InterruptedException e) {
          return;
        }

        if (tick.get() != 0 && !reported.get()) {
          // TODO: if ActivityManager available, further check
          reported.set(true);
          throw new RuntimeException("Bang!");
        }
      }
    }
  }
}

我的问题是,tick 变量不应该是 volatile 吗?此代码会导致可见性问题吗?如果是这样,这段代码会导致生产代码误报吗?

afaik AtomicLong getter 和 setter read/write 来自易失性字段,因此没有必要,我们已对此算法进行改进以避免 false/positives,请升级SDK到最新版本

主要变化之一是:https://github.com/getsentry/sentry-java/blob/main/sentry-android-core/src/main/java/io/sentry/android/core/ANRWatchDog.java#L95-L117