---
# System prepended metadata

title: Машео и Медведима или как пройти через лес ANR и остаться в живых

---

# Машео и Медведима или как пройти через лес ANR и остаться в живых

Для начала пару слов об ANR. Андроид ОС фиксирует ANR когда приложение загружено вычислениями либо повисло дедлоком (читай бесконечным циклом). Есть две причины их появления: приложение не может обработать запрос от ОС в основном потоке в течении 0.5 секунд или в обработчике интента в течении 10 секунд. Чтобы устранить ANR нужно позволить приложению завершить работу в основном потоке как можно раньше.

В мире юнити вычисления обычно происходят в рендерящем потоке и обращаются к основному потоку только для взаимодействия с интерфейсом ОС. Здесь обычно всякие системные окна, работа с нативными элементами ОС и самое интересное - рекламные сдк и тяжеловесные WebView. Если приложение при переходе между потоками юнити и системы задержится больше чем на 500ms, система посчитает это фризом и предложит закрыть приложение. Поэтому нужно максимально упростить для системы этот переход - выгрузить из памяти вообще все, что не имеет отношения к переходу. Показать на экране спинер на 1-2 секунды между переходами и за это время переключиться на минимальный сетап со скриптом реварда и загрузчиком, способным восстановить нужное состояние приложения. Нельзя полагаться на сохранение памяти нативным активити. Приоритеты активити системы - сохранять ресурсы. Андроид выкинет из памяти ваше приложение при первой же возможности. Особенно если обнаружит за ним тормоза.

## Broadcast of Intent { act=android.intent.action.SCREEN_OFF flg=0x50200010 (has extras) }

Фриз на обработке приложением системного события выключения экрана. Зачем спрашивается ему вообще нужно обрабатывать выключение экрана? Спросите медиатор, а он спросит тонну рекламного и отслеживающего хлама, который пытается сдержать в памяти. Благо этот фриз происходит чаще в пространстве рекламы. Все что вы можете сделать в этой ситуации, максимально выгрузить из памяти все внутри юнити, чтобы системе было проще работать с рекламой.

## Input dispatching timed out

Этот ANR может произойти в том числе на экране приложения. Юнити может не справиться с нагрузкой при обработке событий. Важно оптимизировать игровой поток и избежать дедлоков. Скорее всего причина та же - переходы между экранами и юнити держит все ресурсы в памяти.

## Общие моменты

Нет системы мониторинга крашей. Плей консоль не справляется с категоризацией и "склеиванием" багов. Поручите обзор всей фигни Sentry, чтобы видеть краши и фризы с улучшенным определением и контекстной информацией.
