Что происходит с процессом при краше в Android
Что проверяют
Понимаете ли вы, что приложение это отдельный процесс операционной системы со своей виртуальной машиной, и что при необработанном исключении умирает процесс целиком, а не отдельный экран. От этого зависит, где вы будете искать причину падения и что придётся восстанавливать после перезапуска.
Как отвечать
По шагам. Необработанное исключение в любом потоке долетает до обработчика по умолчанию, тот пишет трассировку в Logcat и убивает процесс. Вместе с ним исчезают все активности и фрагменты, фоновые потоки и корутины, объекты-одиночки, кэши в памяти, открытые соединения. Привязанные сервисы отваливаются, система об этом узнаёт и уведомляет тех, кто подписался на смерть процесса.
Что остаётся: задача в списке недавних и сохранённое состояние активностей. Поэтому пользователь часто возвращается и видит тот же экран, но уже в новом процессе, где вся статика в начальном состоянии. Отсюда типичная пара дефектов: экран восстановился, а объект-одиночка с данными пуст, и падение повторяется сразу после возврата.
Стоит назвать соседние случаи, их часто спрашивают следом:
- падение в нативном коде это сигнал, обработчик на стороне виртуальной машины его не увидит, разбираться придётся по системному отчёту о сбое;
- зависание это не падение: процесс жив, главный поток заблокирован, в отчёте лежат трассировки всех потоков, а исключения нет;
- свой обработчик ставится через
Thread.setDefaultUncaughtExceptionHandler, но он обязан передать управление предыдущему.
Где спотыкаются
Говорят, что падает только текущая активность. Умирает процесс, поэтому разговор сразу переходит к тому, что жило в памяти и как это восстановить после перезапуска.
Ставят свой обработчик и не вызывают системный. Процесс остаётся висеть с мёртвым циклом сообщений: пользователь видит замерший экран вместо честного падения, а отчёт о сбое так и не уходит.
Обкладывают подозрительные места перехватом, чтобы не падало. Проглоченное исключение состояние не чинит, оно переносит падение на шаг дальше, туда, где по трассировке причину уже не восстановить.