Сбои и ошибки anr

Время на прочтение
4 мин

Количество просмотров 26K

ANR (Application Not Responding) — ошибка, которая возникает, когда приложение не отвечает. В итоге открывается диалоговое окно, предлагающее пользователю подождать или закрыть приложение.
image alt

Условия возникновения ANR

  • Входные события (кнопки и сенсорные события) не обрабатываются в течение 5 секунд;
  • BroadcastReceiver (onRecieve()) не был обработан в течение указанного времени (foreground — 10 с, background — 60 с);
  • ContentProvider не завершен в течение 10 секунд.

Обычно основной поток блокируется.

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

Класс AppErrors занимается обработкой не только ANR, но и других ошибок, которые могут возникнуть в приложении, включая crash. Метод handleShowAnrUi() как раз и открывает это страшное для многих разработчиков и пользователей окно, отображающее ANR.

class AppErrors {
    ...
    
    void handleShowAnrUi(Message msg) {
        Dialog dialogToShow = null;
        synchronized (mService) {
            AppNotRespondingDialog.Data data = (AppNotRespondingDialog.Data) msg.obj;
            final ProcessRecord proc = data.proc;
            if (proc == null) {
                Slog.e(TAG, "handleShowAnrUi: proc is null");
                return;
            }
            if (proc.anrDialog != null) {
                Slog.e(TAG, "App already has anr dialog: " + proc);
                MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,
                        AppNotRespondingDialog.ALREADY_SHOWING);
                return;
            }

            Intent intent = new Intent("android.intent.action.ANR");
            if (!mService.mProcessesReady) {
                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
                        | Intent.FLAG_RECEIVER_FOREGROUND);
            }
            mService.broadcastIntentLocked(null, null, intent,
                    null, null, 0, null, null, null, AppOpsManager.OP_NONE,
                    null, false, false, MY_PID, Process.SYSTEM_UID, 0 /* TODO: Verify */);

            boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
                    Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
            if (mService.canShowErrorDialogs() || showBackground) {
                dialogToShow = new AppNotRespondingDialog(mService, mContext, data);
                proc.anrDialog = dialogToShow;
            } else {
                MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,
                        AppNotRespondingDialog.CANT_SHOW);
                // Just kill the app if there is no dialog to be shown.
                mService.killAppAtUsersRequest(proc, null);
            }
        }
        // If we've created a crash dialog, show it without the lock held
        if (dialogToShow != null) {
            dialogToShow.show();
        }
    }

...

Однако, ANR начинается не здесь. Как я и говорила выше, одна из первых причин возникновения этой ошибки — это задержка входного события, которая составляет 5 секунд. Недолгим поиском мы можем найти где задается это значение.

namespace android {
// Default input dispatching timeout if there is no focused application or paused window
// from which to determine an appropriate dispatching timeout.
const nsecs_t DEFAULT_INPUT_DISPATCHING_TIMEOUT = 5000 * 1000000LL; // 5 sec

Теперь мы можем посмотреть в коде, где вызывается нативная часть. Это происходит в классе InputManagerService.

    // Native callback.
    private long notifyANR(InputApplicationHandle inputApplicationHandle,
            InputWindowHandle inputWindowHandle, String reason) {
        return mWindowManagerCallbacks.notifyANR(
                inputApplicationHandle, inputWindowHandle, reason);
    }

А вот и mWindowManagerCallbacks в InputMonitor:

        if (appWindowToken != null && appWindowToken.appToken != null) {
            // Notify the activity manager about the timeout and let it decide whether
            // to abort dispatching or keep waiting.
            final AppWindowContainerController controller = appWindowToken.getController();
            final boolean abort = controller != null
                    && controller.keyDispatchingTimedOut(reason,
                            (windowState != null) ? windowState.mSession.mPid : -1);
            if (!abort) {
                // The activity manager declined to abort dispatching.
                // Wait a bit longer and timeout again later.
                return appWindowToken.mInputDispatchingTimeoutNanos;
            }
        } else if (windowState != null) {
            try {
                // Notify the activity manager about the timeout and let it decide whether
                // to abort dispatching or keep waiting.
                long timeout = ActivityManager.getService().inputDispatchingTimedOut(
                        windowState.mSession.mPid, aboveSystem, reason);
                if (timeout >= 0) {
                    // The activity manager declined to abort dispatching.
                    // Wait a bit longer and timeout again later.
                    return timeout * 1000000L; // nanoseconds
                }
            } catch (RemoteException ex) {
            }
        }
        return 0; // abort dispatching
    }

Давайте посмотрим внимательнее на inputDispatchingTimedOut(). Тут как раз мы и показываем сообщение через ActivityManager об истечении времени ожидания и даем пользователю решить, следует ли отменить действие или продолжить ожидание. И именно в ActivityManagerService и вызывается AppErrors в случае возникновения crash или ANR.

  private boolean makeAppCrashingLocked(ProcessRecord app,
            String shortMsg, String longMsg, String stackTrace) {
        app.crashing = true;
        app.crashingReport = generateProcessError(app,
                ActivityManager.ProcessErrorStateInfo.CRASHED, null, shortMsg, longMsg, stackTrace);
        startAppProblemLocked(app);
        app.stopFreezingAllLocked();
        return handleAppCrashLocked(app, shortMsg, longMsg, stackTrace);
    }
    private void makeAppNotRespondingLocked(ProcessRecord app,
            String activity, String shortMsg, String longMsg) {
        app.notResponding = true;
        app.notRespondingReport = generateProcessError(app,
                ActivityManager.ProcessErrorStateInfo.NOT_RESPONDING,
                activity, shortMsg, longMsg, null);
        startAppProblemLocked(app);
        app.stopFreezingAllLocked();
    }

Основные причины ANR

  • Блокировка ввода/вывода
  • Перегрузка сети
  • Блокировка потоков
  • Бесконечный цикл
  • Бизнес-логика выполняется слишком долго

Как избежать ANR

  • Главный поток пользовательского интерфейса выполняет логику, связанную только с пользовательским интерфейсом;
  • Сложные вычисления (например, операции с базой данных, операции ввода-вывода, сетевые операции и т.д.) производятся в отдельном потоке;
  • Используйте Handler для взаимодействия между потоком пользовательского интерфейса и рабочим потоком;
  • Используйте RxJava и т.д. для обработки асинхронных операций.

Как поймать ANR

  • Информация об ANR может храниться в файле /data/anr/traces.txt, либо по другому пути /data/anr/anr_*. Получить ее можно с помощью следующих команд:
    adb root
    adb shell ls /data/anr
    adb pull /data/anr/<filename>
  • Использовать проект с открытым исходным кодом ANR-WatchDog для обнаружения ANR
  • См. Как избежать ANR :)

P.S. Все подборки я публикую в телеграм канале @paradisecurity.

  • Справка
  • Центр правил

В Play Console можно посмотреть информацию о сбоях и ошибках ANR в ваших приложениях. Она поступает с устройств Android, владельцы которых разрешили автоматически отправлять данные об использовании и диагностике.

Как найти данные

  1. Откройте Play Console.
  2. Выберите приложение.
  3. В меню слева выберите Качество > Android Vitals > Сбои и ошибки ANR.
  4. Используйте фильтры в центре экрана для поиска и диагностики неполадок. Чтобы получить подробную информацию о сбое или ошибке ANR, нажмите Подробнее () рядом с нужной строкой.

Примечание. Если во время тестирования приложения перед запуском была обнаружена проблема, то после выбора кластера будет показан отдельный раздел. В нем вы увидите информацию об устройстве и данные logcat с него, подробные сведения о сбое и видео с ошибкой. Это поможет вам устранить неполадку.

Сбои

На этой странице представлены сбои, которые влияют на показатель «Доля сбоев». Сбои группируются по кластерам, чтобы легче было выявлять общие причины.

Если вы хотите посмотреть кластеры для сбоев в активном режиме, используйте фильтр Видимость проблемы.

Чтобы улучшить показатель доли сбоев, в первую очередь устраняйте проблемы, затронувшие наибольшее число пользователей.

Рекомендации по диагностике и устранению сбоев можно найти на сайте для разработчиков Android.

Примечание. Доля сбоев в активном режиме – один из основных показателей Android Vitals, то есть важнейших технических показателей. Он влияет на параметры видимости приложения в Google Play.

Сбои, связанные с SDK

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

Если у сбоя есть отметка «Потенциально связано с SDK» на обзорной странице Android Vitals (Качество > Android Vitals > Общие сведения) и вам кажется, что он вызван неполадкой в коде SDK, вы можете поделиться информацией с поставщиком SDK, чтобы быстрее решить проблему. Отчет о сбое будет содержать название приложения, полную трассировку стека и другие сопутствующие сведения. Поставщики SDK могут просматривать информацию о сбоях, которой вы поделились, в Google Play SDK Console.

Они также могут давать разработчикам приложений рекомендации по устранению сбоев, связанных с их SDK, в разделе «Примечания от поставщика SDK» на обзорной странице Android Vitals (Качество > Android Vitals > Общие сведения). Предоставленная информация поможет выявить основную причину проблемы и способы решения. При появлении примечания к сбою, затронувшему приложение, вам придет уведомление об этом в разделе входящих сообщений в Play Console.

Вы можете помочь нам понять, полезно ли примечание, нажав на значок «Нравится» или «Не нравится» внизу страницы.

Узнать больше о доступных SDK можно на сайте Google Play SDK Index.

Ошибки ANR («Приложение не отвечает»)

Когда приложение не отвечает, открывается диалоговое окно, предлагающее пользователю подождать или закрыть приложение. Такие проблемы называются ошибками ANR. Сведения об ошибках ANR на устройствах с Android 10 и более ранними версиями доступны только в Play Console.

На этой странице представлены ошибки ANR, которые влияют на показатель «Доля ошибок ANR». Ошибки ANR группируются по кластерам, чтобы легче было выявлять общие причины.

Если вы хотите посмотреть кластеры для ошибок ANR в активном режиме, используйте фильтр Видимость проблемы.

Чтобы улучшить показатель доли ошибок ANR, в первую очередь устраняйте проблемы, затронувшие наибольшее число пользователей.

Рекомендации по диагностике и устранению ошибок ANR можно найти на сайте для разработчиков Android.

Примечание. Доля сбоев в активном режиме – один из основных показателей Android Vitals, то есть важнейших технических показателей. Он влияет на параметры видимости приложения в Google Play.

Материалы по теме

Узнать больше об обзорной странице Android Vitals можно в статье о том, как отслеживать производительность приложения с помощью Android Vitals.

Эта информация оказалась полезной?

Как можно улучшить эту статью?

На чтение 2 мин. Просмотров 136 Опубликовано

ANR или Приложение не отвечает — это ошибка Android, которая возникает, когда поток пользовательского интерфейса перестает отвечать на запросы пользователя. Когда приложение перестает отвечать на запросы, пользователю предоставляется диалоговое окно ANR , которое дает ему возможность принудительно закрыть приложение.

Содержание

  1. Что вызывает ANR?
  2. Распространенные виновники
  3. Методы диагностики
  4. Использовать строгий режим
  5. Включить фоновые диалоги ANR в параметрах разработчика
  6. Проверяйте файлы трассировки с помощью adb

Что вызывает ANR?

  1. Если ваше приложение не отвечает на ввод пользователя или BroadcastReceiver в течение пяти секунд.

  2. Ваш BroadcastReceiver не завершил выполнение в течение значительного промежутка времени, и в приложении нет текущей задачи переднего плана.

задача переднего плана — это задача, заметная пользователю. Примером текущей задачи переднего плана является музыкальное приложение, воспроизводящее звук. Эти задачи отображают уведомление для пользователя.

** BroadcastReceiver — это компонент, который прослушивает общесистемные трансляции. например, трансляция с сообщением об отключении экрана.

Распространенные виновники

Обычно ошибки ANR срабатывают, потому что ваше приложение выполняет следующие действия:

  1. Медленные операции с I/ O в основном потоке.
  2. Выполнение длительных вычислений в основном потоке.
  3. Выполнение синхронного вызова связывателя в основном потоке, а другой процесс требует времени, чтобы ответить .
  4. Ожидание в основном потоке другого потока, выполняющего длительную операцию.
  5. Застрял в тупиковой ситуации. Взаимоблокировки могут возникать в основном потоке, когда он ожидает ресурсов, которые не были освобождены другим процессом, поэтому он не может получить необходимые ему ресурсы. Эти другие процессы могут быть в другом потоке, вашем процессе или в вызове связывателя.

Методы диагностики

Использовать строгий режим

С помощью StrictMode вы можете обнаруживать случайные операции ввода-вывода.

Подробнее о StrictMode в официальной документации.

Включить фоновые диалоги ANR в параметрах разработчика

Не все ANR видны пользователю; следовательно, приложение может столкнуться с проблемами производительности без ведома пользователя. Включите фоновые диалоги ANR в параметрах разработчика .

Проверяйте файлы трассировки с помощью adb

Файлы трассировки создаются в событии ANR. Вы можете получить эти файлы, используя Android Debug Bridge (adb) как root, используя следующие команды:

  adb rootadb shell ls/data/anradb pull/data/anr/  

Прочтите полную документацию по Android для ANR здесь.

Приложение отвечает: как мы уменьшили количество ANR-ошибок в шесть раз. Часть 1, про сбор данных +12

Разработка под Android, Тестирование мобильных приложений, Аналитика мобильных приложений, Блог компании Badoo, Google API


Рекомендация: подборка платных и бесплатных курсов 3D-моделирования — https://katalog-kursov.ru/

Пожалуй, одна из худших проблем, которая может случиться с вашим приложением, — ошибка ANR (Application Not Responding), когда приложение не отвечает. Если таких ошибок много, они могут негативно влиять не только на пользовательский опыт, но и на позицию в выдаче Google Play и фичеринг. 

В начале прошлого года количество ANRs в приложении Badoo превышало порог “Bad Behaviour” в Google Play. Поэтому мы собрали команду для решения этой проблемы и потратили несколько месяцев, экспериментируя с разными подходами. В результате мы смогли уменьшить количество таких ошибок более чем в шесть раз.

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

В первой части мы поговорим об основах: что представляет собой ошибка ANR и как её лучше отслеживать. Если вы уже знакомы с этой темой, предлагаю перейти ко второй части, в которой я расскажу о наших способах решения этой проблемы.

Что такое ошибка ANR?

Обычно любое приложение с графическим интерфейсом выполняет все связанные с ним операции и отрисовку в отдельном UI-потоке исполнения. Android не исключение: здесь в главном потоке приложения выполняется цикл, отвечающий за все действия с интерфейсом:

При использовании этого цикла крайне важно не выполнять длительные операции, потому что это напрямую повлияет на отзывчивость приложения. Если в главном потоке выполнять слишком много действий, это может привести к снижению частоты кадров или даже к зависаниям интерфейса:

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

Когда UI-поток Android-приложения блокируется слишком долго, выдаётся ошибка Application Not Responding (ANR).

ANR выдаётся, когда приложение находится в одном из этих состояний:

— на переднем плане находится Activity, приложение в течение пяти секунд не отвечает на входящие события или BroadcastReceiver, например нажатия на кнопки или касания экрана;

— на переднем плане нет Activity, ваш BroadcastReceiver не закончил исполнение в течение длительного времени.

Если ANR случается, когда на переднем плане находится Activity вашего приложения, Android показывает диалоговое окно с предложением закрыть приложение или подождать.

Довольно легко принудительно вызвать ANR, написав Thread.sleep() в любом обработчике интерфейса, например обработчик нажатия кнопки. После нажатия на кнопку вы увидите примерно следующее:

Наличие ошибок ANR в вашем приложении не только влияет на опыт его использования, но и, согласно документации Google, может повлиять на позицию в поисковой выдаче и продвижение в Google Play.

Чтобы снизить вероятность возникновения ANR, нужно всего лишь избегать выполнения длительных операций в главном потоке. Звучит вроде бы просто, но иногда не так легко определить корневую проблему, которая приводит к таким ошибкам. Поэтому довольно важно иметь хорошую систему мониторинга и репортинга ANR-ошибок.

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

Отслеживание ANR

Локальный анализ

Самый простой случай — если у вас есть возможность стабильно воспроизводить ANR-проблему локально. Существует довольно много инструментов, которые могут помочь вам быстро найти источник проблемы.

Первое, что можно сделать, — это проверить дамп стек-трейсов для всех потоков (thread dump). Когда приложение перестает отвечать, Android создаёт дамп всех текущих потоков, который может помочь в анализе проблемы. Обычно он находится в директории /data/anr/, точный путь можно найти в Logcat сразу после сообщения об ошибке ANR.

Дамп потоков содержит стек-трейсы: вы увидите, в каком состоянии был каждый поток (например, какая строка выполнялась в конкретный момент времени). По сути, это состояние приложения на момент создания дампа.

Чаще всего причина возникновения ANR обнаруживается в стек-трейсе главного потока скорее всего, код в этом месте выполняется слишком долго. Если информации из этого стек-трейса будет недостаточно, можно попробовать обратиться к довольно неплохой документации от Google, где описываются основные причины, способы диагностирования и решения проблемы ANR.

Отслеживание с помощью Google Play

Google Play автоматически отправляет отчёты об ошибках ANR, если у пользователя включена такая опция. В консоли Google Play есть несколько метрик и инструментов для анализа ANR.

Во-первых, можно увидеть агрегированные графики с общим количеством ANR-ошибок за день. Также есть такая метрика, как ANR rate — отношение количества сессий за день, в которых возникала хотя бы одна ANR-ошибка, к общему количеству сессий за сутки. Для этой метрики задан порог в 0,47%, превышение которого считается «неудовлетворительным поведением» (“Bad Behaviour”) и может плохо повлиять на позицию приложения в Google Play. 

Во-вторых, можно открывать отдельные отчёты об ANR-ошибках, сгруппированные по схожести на основе стек-трейса. Основные группы находятся в разделе Android Vitals. И это, вероятно, наиболее полезный раздел для выявления самых частых причин возникновения ANR-ошибок в вашем приложении.

Если вы активно используете консоль Google Play, вы могли заметить некоторые её недостатки. Например, к отчётам нельзя прикрепить дополнительную информацию, такую как логи для отладки. Также невозможно настроить логику группировки отчётов. Иногда система помещает в одну группу ошибки, возникшие по разным причинам, а иногда раскидывает по разным группам ошибки, у которых причина одна.

Всё это иногда затрудняет определение основных ошибок и поиск изначальных проблем. Что же можно сделать для улучшения ситуации?

Скачивание данных из Google Play

Для решения проблемы с логикой группировки можно попробовать скачать сырые отчёты об ANR-ошибках из Google Play для последующего ручного анализа. Раньше была возможность выгрузить эти данные из Google Cloud Storage, но несколько лет назад Google перестала поддерживать этот функционал:

Однако всё ещё можно просматривать отдельные отчёты в консоли. Но как нам экспортировать тысячи отчётов, не потратив при этом кучу времени на рутинную работу?

Существует много способов автоматизировать сбор информации с сайтов. Самый правильный и простой — получение данных через API, но, к сожалению, Google не предоставляет публичный API для получения отчётов. Одно из решений — эмулировать пользовательское поведение, автоматически кликая на ссылки и кнопки в браузере и сохраняя отображающийся текст.

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

Мы реализовали скрапер на Selenium и получили сырые отчёты об ANR-ошибках для одного из релизов. Благодаря этому нам удалось проанализировать их так, как не получилось бы сделать с помощью встроенных в консоль Google Play инструментов. Например, просто поискав в отчётах по ключевым словам “Application.onCreate”, мы обнаружили, что около 60% ошибок произошло во время выполнения метода Application.onCreate. При этом в консоли Google Play нет возможности получить такую информацию, так как отчёты разбиты по группам.

Внутренняя аналитика

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

Его функциональность схожа с возможностями других инструментов для краш-репортинга, таких как Firebase Crashlytics и App Center, но ещё и позволяет нам полностью контролировать сохраняемые данные, менять логику группировки и применять сложную фильтрацию:

Это не реальные данные приложения Bumble, иллюстрация сделана просто для примера

Это не реальные данные приложения Bumble, иллюстрация сделана просто для примера

Мы решили отслеживать в Gelato ещё и ANR-ошибки в надежде, что это поможет нам в поиске их причин. Для этого нам нужно было знать, когда приложение перестаёт отвечать. В Android 11 появился новый API, предоставляющий информацию о недавних причинах завершения процесса, но у большинства наших пользователей установлены более ранние версии ОС, поэтому нам требовалось найти другое решение.

И мы нашли простой способ, который часто используется для отслеживания зависаний главного потока исполнения: запустить watchdog-поток, который периодически будет пытаться выполнить задачу в главном потоке. Если задача не выполняется за определённый промежуток времени, то можно сохранить дамп текущего состояния потоков и отправить его в наш инструмент для анализа отчётов о падениях:

Такую логику реализует, например, библиотека, которой мы воспользовались для реализации репортинга в Gelato. Это позволило нам проводить более глубокий анализ данных и лучше интегрировать этот инструмент в нашу инфраструктуру. Например, теперь мы можем сравнивать зависания главного потока в разных вариантах в ходе A/B-тестирования.

Вот пример отчёта в нашей системе:

Это не реальные данные приложения Bumble, иллюстрация сделана просто для примера

Это не реальные данные приложения Bumble, иллюстрация сделана просто для примера

Полезный совет: собирайте и отправляйте вместе с отчётом лог событий аналитики. Иногда это даёт возможность буквально пошагово воспроизвести проблему. 

Если у вас нет своего решения для сбора отчётов о падениях приложения, вы можете настроить репортинг и в сторонние инструменты. Например, можно отправлять ANR-ошибки в App Center или Firebase Crashlytics, так как они предоставляют API для отправки кастомных крашей.

Но помните, что все эти отчёты нельзя считать полной альтернативой ANR-отчётам в Google Play (как мы говорили выше, в Android немного другие правила определения таких ошибок). Но в любом случае это может помочь получить общее представление об основных проблемах. Вполне вероятно, что если генерируется много отчётов о зависании главного потока исполнения в какой-то части вашего приложения, то в ней происходят и ANR-ошибки. 

В завершение

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

Ссылки

  1. Android Vitals в Google Play

  2. Отладка ANR

  3. API для получения причин завершения процесса

  4. Фреймворк для тестирования веб-страниц

  5. Библиотека для определения зависаний

I have searched on the internet regarding what an ANR is. And I studied those references as well. But I don’t get details regarding a crash in Android.

Can someone tell me the difference between ANR(Android not Responding) and a crash in Android?

Shriroop's user avatar

Shriroop

1,1742 gold badges16 silver badges28 bronze badges

asked Nov 26, 2013 at 9:48

user3035740's user avatar

ANR stands for Application Not Responding.

An ANR will occur if you are running a process on the UI thread which takes a long time, usually around 5 seconds. During this time the GUI (Graphical User Interface) will lock up which will result in anything the user presses will not be actioned. After the 5 seconds approx has occurred, if the thread still hasn’t recovered then an ANR dialogue box is shown informing the user that the application is not responding and will give the user the choice to either wait, in the hope that the app will eventually recover, or to force close the app.

A crash is when an exception within the app has been thrown which has not been handled. For example, if you try to set the text of an EditText component, but the EditText is null and there is no try catch statement to catch the exception that your app will crash and will be force closed. The user will not see what caused the crash, they will be shown a dialogue telling that the app has force closed unexpectedly and will give them the option to send a bug report. In this example if you were to look in the bug report you would see the error caused by java.lang.NullPointerException.

ggorlen's user avatar

ggorlen

45.6k7 gold badges78 silver badges108 bronze badges

answered Nov 26, 2013 at 10:05

Boardy's user avatar

BoardyBoardy

35.4k104 gold badges256 silver badges448 bronze badges

2

ANR (Application Not Responding) is due to handling a long running task in the main (UI) thread. If the main thread is stopped for more than 5 seconds, the user will get an ANR.

Crashes are due to exceptions and errors like NullPointerException, ClassNotFoundException, typecasting or parsing errors, etc. ANR also causes a crash of the application.

Note: Never perform a long-running task on the UI thread.

Reference ANR

ggorlen's user avatar

ggorlen

45.6k7 gold badges78 silver badges108 bronze badges

answered Nov 26, 2013 at 9:50

Shakeeb Ayaz's user avatar

Shakeeb AyazShakeeb Ayaz

6,2106 gold badges45 silver badges64 bronze badges

4

ANR and Crash Examples:

This question already has an accepted answer, but I am adding 2 simple examples to understand ANR and Crash better.

ANR:

// this will produce an ANR on your app
int i = 0;
while(true) {
    i++;
}

Crash:

// this will crash your app : will produce java.lang.ArithmeticException
int value = 5, i = 0;
int result = value / i;

answered Jan 4, 2018 at 14:17

zeeali's user avatar

zeealizeeali

1,53420 silver badges31 bronze badges

Application Not Responding (ANR):

ANR will display in the following conditions:

  • Response to the input event (such as key press or screen touch even) within 5 Sec.

  • A Broadcast Receiver hasn’t finished executing within 10 Sec.

How to avoid ANRs?

  • Create a different worker thread for long running operations like database operations, network operations etc.

Reinforce Responsiveness:
In android app usually, 100 to 200 ms is the threshold beyond which user will feel that app is slow. Following are the tips through which we can show application more responsive.

  • Show progress dialog whenever you are doing any background work and a user is waiting for the response.

  • For games specifically, do calculations for moves in the worker thread.

  • Show splash screen if your application has time-consuming initial setup.

Crash:
The crash is unhandled condition into the application and it will forcefully close our application. Some of the examples of crashes are like Nullpointer exception, Illegal state exception etc.

answered Mar 12, 2017 at 12:51

Shri's user avatar

ShriShri

914 bronze badges

ANR stands for Application Not Responding, which means that your app does not register events on the UI Thread anymore because a long running operation is executed there

answered Nov 26, 2013 at 9:52

Display name's user avatar

Display nameDisplay name

2,6972 gold badges31 silver badges49 bronze badges

ANR: It is called when anything your application is doing in the UI thread that 
takes a long time to complete (5 sec approx)

Reference: ANR

Crash: It is called when  your Application gets some Error or Exception raised by the DVM

answered Nov 26, 2013 at 9:56

Nitesh Tiwari's user avatar

Nitesh TiwariNitesh Tiwari

4,7423 gold badges29 silver badges46 bronze badges

ANR also caused by-

  1. No response to an input event (such as key press or screen touch events) within 5 seconds.
  2. A BroadcastReceiver hasn’t finished executing within 10 seconds.

answered Jan 5, 2016 at 14:43

A J's user avatar

A JA J

4,5525 gold badges50 silver badges80 bronze badges

ANR stands for Application Not Responding and its occurs when long operation takes place into Main thread……

Crash are due to exception and error like Nullpoint,

answered Jun 16, 2016 at 5:05

zohaib's user avatar

ANR stands for Application Not Responding.

It can occur due to many reasons like if an application blocks on some I/O operation on the UI thread so the system can’t process incoming user input events. Or perhaps the app spends too much time building an elaborate in-memory structure or computing the next move in the UI thread.

Blocking the main thread, won’t result in a crash, but a popup will be displayed to let users kills the app after 5 seconds.

But For Crash, the main reason is the human errors.
Most of the time an app crashes is because of a coding/design error made by human

Human Errors

Lack of testing

Null Pointer exception

OutofMemory

Example :

This is common when a programmer makes a reference to an object or variable that does not exist, basically creating a null-pointer error.

If you have a bad connection, that can also make your apps crash. The app could also have memory management problems.

Please see my answer for the type of android specific exception which may cause the crash.

Android Specific Exception

answered Jun 22, 2017 at 5:28

KishuDroid's user avatar

KishuDroidKishuDroid

5,4314 gold badges30 silver badges47 bronze badges

ANR for ex: if You are downloading huge amount data in ui thread, meny other possibilities like insufficient memory etc it will come.. probably it leads to crashes in android , We can’t say both are same one follows other

answered Nov 26, 2013 at 9:50

pavanmvn's user avatar

pavanmvnpavanmvn

74910 silver badges21 bronze badges

1

[ANR and Crash Different][1]
Android applications normally run entirely on a single thread by default the “UI thread” or
“main thread”. This means anything your application is doing in the UI thread that takes a long time to complete can trigger the ANR dialog because your application is not giving itself a chance to handle the input event or intent broadcasts.

answered Oct 4, 2017 at 5:26

Raj Padvi's user avatar

ANR: Basically due to a long running task on main thread.

There are some common patterns to look for when diagnosing ANRs:

  1. The app is doing slow operations involving I/O on the main thread.
  2. The app is doing a long calculation on the main thread.
  3. The main thread is doing a synchronous binder call to another process, and that other process is taking a long time to return.
  4. The main thread is blocked waiting for a synchronized block for a long operation that is happening on another thread.
  5. The main thread is in a deadlock with another thread, either in your process or via a binder call. The main thread is not just waiting for a long operation to finish, but is in a deadlock situation.

The following techniques can help you find out which of these causes is causing your ANRs.

CRASH:

Reason for crashs can be many. Some reasons are obvious, like checking for a null value or empty string, but others are more subtle, like passing invalid arguments to an API or even complex multithreaded interactions

answered Dec 13, 2017 at 18:22

Mithun M's user avatar

Понравилась статья? Поделить с друзьями:
  • Сбербизнес код ошибки 3027
  • Сбк 200 рентген аппарат ошибки
  • Сбербизнес код ошибки 3003
  • Сбис плагин ошибка установки
  • Сбербизнес код ошибки 3014