TGViewer
Nek.12 | AI, SWE, Tech [RU] Nek.12 | AI, SWE, Tech [RU] @nek_12_personal · 739 subscribers
Post #744 1.5K
Как достичь 0% ANR в Андроид-приложениях?

После года стараний, я наконец-то добился 0% ANR в респавне. Привожу краткий чеклист как я это сделал:

1. Добавьте логирование событий в Crashlytics. Crashlytics позволяет записывать любые логи в отдельное поле, чтобы видеть, что делал пользователь перед ANR. Библиотеки вроде FlowMVI позволяют делать это автоматически. Без этого вы не поймете, что привело к ANR, потому что их стактрейсы абсолютно бесполезные.

2. Полностью удалите SharedPreferences из вашего проекта. Особенно зашифрованные. Они являются причиной №1 ANR. Вместо этого используйте DataStore с Kotlin Serialization.

3. Поэкспериментируйте с обработкой событий UI в фоновом потоке, если вы имеете дело со сторонним SDK, вызывающим сбои. Это не решит ANR, а замаскирует его, уведя долгую операцию с мейна раньше.

4. Избегайте использования библиотек GMS в основном потоке. Они пишут свое дерьмо в префы. Создайте абстракции на основе корутин.

5. Проверьте использование Bitmap / drawable, растровые изображения при неправильном размещении (drawable-nodpi) могут привести к загрузке слишком больших изображений и анр.

6. Включите StrictMode и агрессивно устраняйте все операции ввода-вывода в основном потоке. Охереете, насколько их у вас много. Всегда держите StrictMode включенным.

7. Ищите утечки памяти: Никогда не используйте глобальные Coroutine Scopes. Добавляйте таймауты ко всем suspend-функциям с вводом-выводом. Добавляйте обработку ошибок. Используйте LeakCanary. Профилируйте использование памяти. Анализируйте аналитику из шага 1, чтобы найти действия пользователя, приводящие к ANR.

80% моих ANR были вызваны утечками памяти и происходили во время огромной GC-паузы.

8. Не верьте стектрейсам. Они вводят в заблуждение. 90% ANR вызваны вами. Я достиг 0.01% ANR после того, как серьезно отнесся к их поиску и перестал винить queue.NativePollOnce во всех своих проблемах. 0 ANR за последние 90 дней.

9. Избегайте загрузки файлов в память. Запретите использование File().readBytes(). Всегда используйте потоковую передачу для JSON, бинарных данных и файлов, рядов базы данных, шифруйте данные через Output/InputStream

10. Используйте Compose и избегайте тяжелых макетов. Некоторые устройства настолько плохи, что отрисовка UI вызывает ANR. Сделайте UI легким и загружайте его постепенно. Следите чтобы не было циклов рекомпозиций, их тяжело заметить.

11. Вызывайте goAsync() в броадкаст ресиверах, ставьте таймаут (обязательно!) и выполняйте работу в корутине. Это позволит в них избежать ANR из-за того, что броадкаст ресиверы часто выполняются системой под огромной нагрузкой (во время BOOT_COMPLETED сотни приложений гоняют броадкасты) и вам может прилететь анр просто потому что залагал телефон.

12. Избегайте байндеров сервисов вообще (bindservice()). Выгоднее будет отправлять события через application класс. Байндеры к сервисам всегда будут вызывать анр, хоть ты что сделай. Это нативный код который на сяоми топовых за свои деньги будет вступать в contention за системные вызовы на их древнем чипсете, а прилетать будет вам.
  • 🔥 15
  • 👍 9
More from @nek_12_personal
  1. Sep 30, 2026Скорбя по моему плану, я пропустил релиз 6.1 sol, о которой какие-то невероятные вещи гово…
  2. Sep 29, 2026Ужасные новости для тех, кто пользовался подпиской OpenAI. TLDR: С завтрашнего дня ваша по…
  3. Sep 22, 2026https://youtu.be/32zpk7tqs0M Запись доклада уже доступна на ютубе! Напомню, что я сравнил…
  4. Sep 22, 2026Доброе утро, сегодня вечером ожидается релиз GPT-6-Sol, GPT-6-Luna, а также сопровождающий…
  5. Sep 18, 2026Post #1150
  6. Sep 18, 2026Господа, в твиттерах шумит новая модель для принятия решений названная Jev, запустившаяся…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →