首页 > 解决方案 > 最近几天 ANR 突然激增,trace 中没有我的任何代码。我该如何解决这个问题?

问题描述

最近我的 ANR 突然飙升,好像 10 月 5 日是他们真正开始飙升的时候。它们影响了我在那个日期前后发布的最新版本,但它们也影响了我在 9 月初发布的上一个版本。对于那个较早的版本,我可以看到 ANR 真正开始于 5 日。

对于我的前两个 ANR 跟踪,我没有看到任何涉及我的代码的行,并且其中的信息并不是真正有用。我包括其中一条痕迹的全屏打印输出,它们都有点不同,但它们有一些相同的东西。特别是我注意到他们中的大多数人都在进行 gms 测量呼叫。虽然我最近没有更新 gms。

所以我的问题是,我该如何解决这样的跟踪问题?

追踪链接https://imgur.com/JYaU9Uo

谢谢。

标签: androidandroid-anr-dialog

解决方案


以下是来自 Traces 的一些线索:

  1. 使用倒计时锁存器。因此,使用闩锁的线程之一需要很长时间才能完成。这导致主线程被阻塞。
  2. 正在编辑共享首选项
  3. 服务正在停止

您的应用程序中是否发生了这种现象?“正在停止服务,正在编辑共享首选项”。

倒计时锁存器: java.util.concurrent.CountDownLatch 是一种并发构造,它允许一个或多个线程等待给定的一组操作完成。CountDownLatch 使用给定的计数进行初始化。此计数通过调用 countDown() 方法而递减。等待此计数达到零的线程可以调用 await() 方法之一。调用 await() 会阻塞线程,直到计数达到零

@casolorz:调试 ANR 是一项挑战。您拥有的 ANR 跟踪只是发生 ANR 时应用程序进程中所有线程的状态。它不像调试崩溃那样简单。

这里有一些你可以调试的方法

方法一

  1. 查看主线程的状态。
  2. 如果主线程正在等待,那么找出是什么让它等待。可能是其他一些线程让它等待。您可以通过跟踪线程标识符来找出罪魁祸首。您可能会看到类似“由于 Thread tid= 持有资源而正在等待”之类的内容。tid 应该可以帮助您找到罪魁祸首。
  3. 使用 tid,您可以尽可能长时间地沿着小路走,直到走到死胡同。

如果方法 1 没有让你取得进展,试试这个

方法2:提出假设。

找出主线程发生了什么在您的情况下,该应用程序正在启动。您可以看到 Zygote 正在初始化,这证实了这一假设。

一旦您知道 ANR 在应用启动时发生,请查看应用启动时发生的与 I/O 或网络相关的情况。

这可能就像访问一个安静的 SharedPreference(说 1 mb 这是一件坏事。您需要考虑使共享首选项变薄)。

或者这可能是您正在初始化的 SDK。您可以使用 Traces 分析您的代码,这将使您对需要很长时间才能执行的事情有一个公平的认识。

有时这可能与您的应用程序完全无关。我已经看到了这种情况。

调试 ANR 非常具有挑战性,也很有趣。


推荐阅读