android - 最近几天 ANR 突然激增,trace 中没有我的任何代码。我该如何解决这个问题?
问题描述
最近我的 ANR 突然飙升,好像 10 月 5 日是他们真正开始飙升的时候。它们影响了我在那个日期前后发布的最新版本,但它们也影响了我在 9 月初发布的上一个版本。对于那个较早的版本,我可以看到 ANR 真正开始于 5 日。
对于我的前两个 ANR 跟踪,我没有看到任何涉及我的代码的行,并且其中的信息并不是真正有用。我包括其中一条痕迹的全屏打印输出,它们都有点不同,但它们有一些相同的东西。特别是我注意到他们中的大多数人都在进行 gms 测量呼叫。虽然我最近没有更新 gms。
所以我的问题是,我该如何解决这样的跟踪问题?
谢谢。
解决方案
以下是来自 Traces 的一些线索:
- 使用倒计时锁存器。因此,使用闩锁的线程之一需要很长时间才能完成。这导致主线程被阻塞。
- 正在编辑共享首选项
- 服务正在停止
您的应用程序中是否发生了这种现象?“正在停止服务,正在编辑共享首选项”。
倒计时锁存器: java.util.concurrent.CountDownLatch 是一种并发构造,它允许一个或多个线程等待给定的一组操作完成。CountDownLatch 使用给定的计数进行初始化。此计数通过调用 countDown() 方法而递减。等待此计数达到零的线程可以调用 await() 方法之一。调用 await() 会阻塞线程,直到计数达到零。
@casolorz:调试 ANR 是一项挑战。您拥有的 ANR 跟踪只是发生 ANR 时应用程序进程中所有线程的状态。它不像调试崩溃那样简单。
这里有一些你可以调试的方法
方法一
- 查看主线程的状态。
- 如果主线程正在等待,那么找出是什么让它等待。可能是其他一些线程让它等待。您可以通过跟踪线程标识符来找出罪魁祸首。您可能会看到类似“由于 Thread tid= 持有资源而正在等待”之类的内容。tid 应该可以帮助您找到罪魁祸首。
- 使用 tid,您可以尽可能长时间地沿着小路走,直到走到死胡同。
如果方法 1 没有让你取得进展,试试这个
方法2:提出假设。
找出主线程发生了什么在您的情况下,该应用程序正在启动。您可以看到 Zygote 正在初始化,这证实了这一假设。
一旦您知道 ANR 在应用启动时发生,请查看应用启动时发生的与 I/O 或网络相关的情况。
这可能就像访问一个安静的 SharedPreference(说 1 mb 这是一件坏事。您需要考虑使共享首选项变薄)。
或者这可能是您正在初始化的 SDK。您可以使用 Traces 分析您的代码,这将使您对需要很长时间才能执行的事情有一个公平的认识。
有时这可能与您的应用程序完全无关。我已经看到了这种情况。
调试 ANR 非常具有挑战性,也很有趣。
推荐阅读
- angular - 如何重写我的打字稿代码,使其不会触发 http 请求?
- python - 多个 if 条件给了我错误的答案
- spring-boot - 当我想我尝试了很多解决方案时,如何在 Kotlin 和 Gradle 项目中使用 DevTools?
- python - 为什么 tf.matmul 不能与转置张量一起使用?
- css - 如何在详细信息上方设置 Woocommerce 产品图片
- excel - 根据多个单元格值隐藏或取消隐藏工作表
- python - 无法在scrapy的解析回调中发送请求
- python - 过大的预测 MLPRegressor
- python-3.x - 如何打开已编译的 Python 文件 (.pyc)
- ios - css 媒体查询不适用于 ipad 横向模式