Вот пара подсказок из Следов:
- Используется защелка CountDown. Таким образом, один из тех потоков, который использует защелку, занимает много времени для завершения. Это приводит к блокировке основного потока.
- Общие настройки редактируются
- Служба останавливается
Есть ли что-то подобное в этом явлении, которое происходит вваше приложение? «Служба остановлена, а общие настройки редактируются».
Защелка обратного отсчета: java.util.concurrent.CountDownLatch является параллелизмомконструкция, позволяющая одному или нескольким потокам ожидать завершения определенного набора операций. CountDownLatch инициализируется с заданным количеством. Это число уменьшается при вызове метода countDown (). Потоки, ожидающие, пока это число достигнет нуля, могут вызывать один из методов await (). Вызов await () блокирует поток до тех пор, пока счетчик не достигнет нуля .
@ casolorz: Отладка ANR - это сложная задача. Трассировка ANR - это просто состояние всех потоков в вашем процессе приложения, когда произошло ANR. Это не так просто, как отладка сбоя.
Вот несколько способов отладки
Метод 1
- См. состояние основного потока.
- Если основной поток находится в состоянии ожидания, то выясните, что заставляет его ждать. Это может быть какой-то другой поток, который заставляет его ждать. Вы можете узнать виновника, отследив идентификатор потока. Вы можете увидеть что-то вроде «Ожидание из-за ресурса, удерживаемого Thread tid =». tid должен помочь вам перейти к виновнику.
- С помощью tid вы можете следовать по следу как можно дольше, пока не достигнете тупика.
Если метод 1 не даетвы продвигаетесь вперед, попробуйте это
Метод 2: Придумайте Hyphothesis.
Узнайте, что происходит с главным потоком В вашем случае приложение запускается,Вы можете видеть, как Zygote инициализируется, что подтверждает эту гипотезу.
Как только вы узнаете, что ANR происходит при запуске приложения, посмотрите, что происходит при запуске приложения, что относится к вводу-выводу или сети.
Это может быть похоже на доступ к SharedPreference, который является довольно тяжелым (скажем, 1 МБ, что является плохой вещью. Вам следует подумать об уменьшении общего префикса).
Или это может быть SDK, который вы инициализируете. Вы можете профилировать свой код с помощью Traces, и это даст вам четкое представление о том, что для его выполнения требуется много времени.
Иногда это может быть совершенно не связано с вашим приложением. Я видел, как это происходит.
Отладка ANR довольно сложная и интересная.