Внезапный всплеск ANR за последние несколько дней, трассировка не содержит моего кода. Как мне решить эту проблему? - PullRequest
0 голосов
/ 13 октября 2019

В последнее время у меня внезапный всплеск ANR, кажется, что 5 октября они действительно начали набирать обороты. Они влияют на мой последний выпуск, выпущенный примерно с той же даты, но они также влияют на мой предыдущий выпуск, выпущенный в сентябре. Для этого более раннего выпуска я вижу, что ANR действительно начались 5-го.

Для двух моих лучших трассировок ANR я не вижу ни одной строки, содержащей мой код, и информация в них не очень полезна. Я включаю полноэкранную распечатку одного из следов, они все немного отличаются, но у них есть некоторые из тех же самых вещей. В частности, я заметил, что у большинства из них происходит вызов измерения gms. Хотя я недавно не обновлял gms.

Итак, мой вопрос, как мне решить проблему с трассировкой, подобной этой?

Ссылка трассировки https://imgur.com/JYaU9Uo

Спасибо.

1 Ответ

1 голос
/ 14 октября 2019

Вот пара подсказок из Следов:

  1. Используется защелка CountDown. Таким образом, один из тех потоков, который использует защелку, занимает много времени для завершения. Это приводит к блокировке основного потока.
  2. Общие настройки редактируются
  3. Служба останавливается

Есть ли что-то подобное в этом явлении, которое происходит вваше приложение? «Служба остановлена, а общие настройки редактируются».

Защелка обратного отсчета: java.util.concurrent.CountDownLatch является параллелизмомконструкция, позволяющая одному или нескольким потокам ожидать завершения определенного набора операций. CountDownLatch инициализируется с заданным количеством. Это число уменьшается при вызове метода countDown (). Потоки, ожидающие, пока это число достигнет нуля, могут вызывать один из методов await (). Вызов await () блокирует поток до тех пор, пока счетчик не достигнет нуля .

@ casolorz: Отладка ANR - это сложная задача. Трассировка ANR - это просто состояние всех потоков в вашем процессе приложения, когда произошло ANR. Это не так просто, как отладка сбоя.

Вот несколько способов отладки

Метод 1

  1. См. состояние основного потока.
  2. Если основной поток находится в состоянии ожидания, то выясните, что заставляет его ждать. Это может быть какой-то другой поток, который заставляет его ждать. Вы можете узнать виновника, отследив идентификатор потока. Вы можете увидеть что-то вроде «Ожидание из-за ресурса, удерживаемого Thread tid =». tid должен помочь вам перейти к виновнику.
  3. С помощью tid вы можете следовать по следу как можно дольше, пока не достигнете тупика.

Если метод 1 не даетвы продвигаетесь вперед, попробуйте это

Метод 2: Придумайте Hyphothesis.

Узнайте, что происходит с главным потоком В вашем случае приложение запускается,Вы можете видеть, как Zygote инициализируется, что подтверждает эту гипотезу.

Как только вы узнаете, что ANR происходит при запуске приложения, посмотрите, что происходит при запуске приложения, что относится к вводу-выводу или сети.

Это может быть похоже на доступ к SharedPreference, который является довольно тяжелым (скажем, 1 МБ, что является плохой вещью. Вам следует подумать об уменьшении общего префикса).

Или это может быть SDK, который вы инициализируете. Вы можете профилировать свой код с помощью Traces, и это даст вам четкое представление о том, что для его выполнения требуется много времени.

Иногда это может быть совершенно не связано с вашим приложением. Я видел, как это происходит.

Отладка ANR довольно сложная и интересная.

...