Что такое anr android
Наверное можно написать код, который будет бить все рекорды по быстродействию, но он все равно будет выглядеть вялым, зависать на значительный период времени, и думать слишком долго, чтобы обработать процесс ввода. И самое плохое, что может случиться в плане отзывчивости программы — это появление окна диалога «Приложение не отвечает» (экран ANR, «Application Not Responding»).
В Android имеется защита от приложений, которые не отвечают должным образом по времени, и в этом случае система отображает соответствующее окно диалога ANR, которое предлагает остановить неработающее приложение, как это показано на скриншоте. В этот момент Ваше предложение не отвечает в течение установленного периода времени, и система предлагает пользователю опцию выбора — закрыть приложение или еще подождать. При разработке приложения является критичным требование отзывчивости приложения для системы, чтобы ANR-диалог никогда не появлялся для пользователя.
Этот документ описывает, как система Android определяет, что приложение не отвечает, и здесь предоставлено руководство — как сделать приложение всегда отзывчивым.
[Когда срабатывает ANR?]
Обычно система отображает ANR, если приложение не может ответить на ввод пользователя. Например, если приложение блокирует операции ввода-вывода I/O (часто случается при доступе к сети) на потоке обработки интерфейса UI, то система не может обработать события ввода от пользователя. Или возможно приложение тратит слишком много времени, создавая в памяти тщательно продуманную структуру данных в памяти, или вычисляя следующее перемещение в игре на потоке UI. Всегда важно делать эти вычисления эффективными, однако все равно даже самый эффективный код требует некоторого времени для выполнения.
В любых ситуациях, в которых Ваше приложение может производить потенциально длительную операцию, Вы не должны выполнять работу в потоке UI. Вместо этого нужно создать рабочий поток, и выполнять длительные действия и циклы в этом потоке. Это сохранит работоспособность потока UI (который поддерживает цикл обработки событий интерфейса пользователя UI), и предотвратит от того, что система будет считать Ваш код зависшим. Поскольку такая потоковая обработка выполняется на уровне класса, Вы можете думать о скорости отклика как о проблеме класса (сравните с быстродействием традиционного кода, где скорость отклика основывается на уровне быстродействия методов).
В Android отслеживание работоспособности (отзывчивости, проверка на «не зависло ли») приложения мониторится системными службами менеджера активности Activity Manager и менеджера окон Window Manager. Android отобразит диалог ANR для отдельного приложения, когда будет обнаружено одно из следующих условий:
• Нет ответа на событие ввода (такое как нажатие на кнопку или касание экрана) в течение 5 секунд.
• BroadcastReceiver не завершил выполнение в течение 10 секунд.
[Как избежать появления диалога ANR]
Приложения Android обычно работают полностью на одном потоке по умолчанию, который называется «UI thread» (поток интерфейса пользователя) или «main thread» (главный поток). Это означает, что если Ваше приложение делает что-то в потоке UI слишком долго, то может сработать ANR, потому что Ваша программа не дает самой себе шанса обработать событие ввода или внутренние широковещательные сообщения (intent broadcasts).
Таким образом, любой метод, который работает в потоке UI, должен делать в этом потоке как можно меньше работы, насколько это возможно. В частности, активности (см. [2]) должны выполнять как можно действий в ключевых обработчиках своего жизненного цикла, таких как onCreate() и onResume(). Потенциально долгие и непрогнозируемые по длительности операции, такие как работа с сетью или операции с базами данных, или дорогие в плане вычислительных ресурсов расчеты типа изменения размера растрового изображения должны выполняться в отдельном рабочем потоке (или в случае операций с базами данных, через асинхронный запрос).
Наиболее эффективный метод создания рабочего потока для долгих операций — применение класса AsyncTask [4]. Просто расширите (extend) класс AsyncTask, и реализуйте (implement) метод doInBackground() , чтобы выполнить нужную Вам работу. Чтобы передать изменения в процессе работы пользователю (в поток UI), Вы можете вызвать publishProgress() , который запустит метод обратного вызова onProgressUpdate() , так называемый callback method. Из Вашей реализации onProgressUpdate() (которая работает в потоке UI) Вы можете оповещать пользователя о результатах работы потока. Пример:
Чтобы запустить этот рабочий поток, просто создайте экземпляр класса DownloadFilesTask и вызовите метод execute():
Вы могли бы также захотеть создать собственный класс Thread или HandlerThread, несмотря на то, что это несколько сложнее, чем использование AsyncTask. Если Вы решились на это, то должны установить приоритет потока (thread priority) в значение «background» путем вызова Process.setThreadPriority() и передачи ему константы THREAD_PRIORITY_BACKGROUND . Если Вы не установите приоритет потока в пониженное значение (как здесь рекомендуется), то Вы все еще можете замедлить Ваше приложение, потому что рабочий поток по умолчанию будет работать с тем же приоритетом, что и поток интерфейса UI thread.
Если Вы реализовали Thread или HandlerThread для рабочего потока, то убедитесь, что Ваш UI thread не блокируется, когда он ждет результата рабочего потока, т. е. не вызывайте методов Thread.wait() или Thread.sleep() . Вместо блокирования на ожидании завершения рабочего потока, ваш главный поток UI (main thread) должен предоставить Handler (обработчик) для других потоков, чтобы отправить туда сообщение при их завершении. Разработанное по такому методу приложение позволит потоку UI быть всегда готовым к вводу и это предотвратит появление диалогов ANR, когда истечет таймаут 5 секунд на обработку событий ввода.
Определенное ограничение на время выполнения BroadcastReceiver подчеркивает тот факт, что подразумевается для действий в приемниках широковещательных сообщений: малые по объему дискретные действия в фоновом режиме, такие как установка или регистрация оповещений (registering Notification). Таким образом, как и с другими методами, вызываемыми в потоке интерфейса UI, приложения должны избегать потенциально длительных операций или вычислений в broadcast receiver. Однако вместо того, чтобы выполнять интенсивные вычислительные задачи через рабочие потоки, Ваше приложение должно запустить IntentService, если потенциально долгие действия должны быть предприняты в ответ на широковещательную передачу (intent broadcast).
Совет: Вы можете использовать режим StrictMode, чтобы помочь себе найти потенциально долго выполняющиеся операции, такие как работа с сетью или базой данных, которые Вы случайно запустили в главном потоке приложения.
[Как уменьшить время отклика]
Обычно длительность отклика 100 .. 200 мс является порогом, после которого пользователи будут чувствовать замедление приложения. Есть еще некоторые дополнительные подсказки, как избежать ANR и сделать Ваше приложение реагирующим быстрее с точки зрения пользователя:
• Если Ваше приложение делает какую-то работу в фоновом режиме в ответ на ввод пользователя, показывайте индикатор прогресса — показывающий, что что-то делается и/или сколько уже сделано (можно использовать в UI такой виджет как ProgressBar).
• Для игр важно выполнять вычисления для движений в рабочем потоке (не в главном потоке, обрабатывающем интерфейс UI).
• Если Ваше приложение имеет долгую начальную фазу запуска и инициализации, рассмотрите возможность показа splash screen, или выполните отрисовку главного вида окна как можно быстрее, показывая при этом, что загрузка идет, и при этом асинхронно заполните всю нужную информацию. В любом случае показывайте, что работа по выполнению некого действия все же идет, идет успешно и скоро должна закончиться, чтобы пользователь понимал, что происходит, и не чувствовал, что приложение зависло.
• Используйте инструменты оптимизации (performance tools), такие как Systrace и Traceview, чтобы определить узкие места в отзывчивости Вашего приложения.
Источник
Все о функциях разработчика в вашем телефоне
Константин Иванов
Настройки, которые используются для отладки и для разработки приложений, спрятаны в вашем телефоне – спрятаны в прямом смысле слова. Многие из нас идут в соответствующий раздел меню, чтобы запустить отладку USB или переключиться к рабочему модулю ART, но кроме этого, здесь имеется целый список настроек. Большая часть никогда вам не понадобится, но разве не интересно узнать, что скрывается в недрах вашего устройства?
«Разблокируем» функции разработчика в телефоне
Как говорилось выше, эти функции изначально скрыты. Это имеет смысл, поскольку найти их просто, а большинству людей они попросту не нужны. Для того, чтобы добраться до них, идем в раздел «Об устройстве» и ищем там пункт «Номер сборки». После пяти быстрых тапов появляется диалоговое окно – теперь устройство считает вас разработчиком. Только попробуйте ничего не испортить, ладно? Ну, или делайте что хотите – тоже вариант. Так или иначе, возможность заставить ваш телефон перестать работать всегда имеется.
А теперь посмотрим на предложенные функции повнимательнее.
Настройки
- Создать отчет об ошибках. Тапаете здесь, чтобы отправить соответствующее сообщение туда, куда вы хотите. Устройство готовит нужные файлы для отправки, что занимает пару минут, после чего вы видите уведомление. Если смахнуть его, процесс остановится, а если тапнуть, сообщение отправится.
- Пароль резервного копирования. Позволяет использовать ADB для создания бэкапа и восстановления приложений и связанных с ними данных на вашем компьютере. Резервное копирование данных требует введения пароля, и без него данные не могут быть восстановлены.
- Активный режим. Выбор этого пункта позволяет вам держать экран работающим постоянно при подключении телефона кабелем к зарядному устройству или к компьютеру по USB. Не стоит использовать этот пункт без надобности, поскольку это верный способ выжечь экран.
- Выбор рабочего модуля. Именно здесь вы можете выбрать между Dalvik и ART. Последний по-прежнему находится в тестовом режиме – это явно не то, что мы увидим в Android L. С некоторыми телефонами у него настоящий антагонизм, поэтому стоит уточнить на соответствующем форуме насчет вашей модели устройства.
- Включить журнал трансляции операций HCI Bluetooth. Иногда разработчику или специалисту по безопасности требуется перехватить и проанализировать пакеты Bluetooth HCI. Включение этого пункта помещает их в файл, который находится во встроенной памяти устройства (/sdcard/btsnoop_hci.log) для восстановления. После этого их можно проанализировать программой типа Wireshark.
- Статистика процессов. Все, что вам может понадобиться узнать о запущенных на вашем устройстве процессах. Тапаете здесь, а потом на одном из пунктов. Для обычного пользователя это просто набор цифр, но для разработчика может быть весьма полезным.
- Отладка USB. То, что позволяет вашему телефону связываться с компьютером, используя Android Debug Bridge (ADB). Это требуется для использования DDMS или команд ADB.
- Отозвать авторизацию отладки USB. Когда отладка при помощи компьютера происходит в первый раз, вам нужно авторизовать его и установить пару ключей. Эта настройка отменяет данное действие и предлагает повторить его снова.
- Отчеты об ошибках. Включает опцию, которая становится видимой, когда вы зажимаете кнопку питания для сбора и отправки отчета об ошибках. Очень удобно, если вы что-то тестируете.
- Фиктивные местоположения. Эта настройка позволяет вам вручную задавать информацию о местоположении, заставляя ваш телефон думать, что он там, где его в действительности нет. Кроме читов для Forsquare, это полезно для приложений, которые используют информацию о местоположении.
- Приложение для отладки. Эта настройка позволяет вам выбрать приложение для отладки. Вам не требуется действительно подключаться к отладчику, но если вы включите его, то не будете получать сообщений об ошибках, когда останавливаетесь на точке останова. Если вы не понимаете, что это значит, тогда эта настройка вам никогда не требовалась и не понадобится. Она создана для работы со средствами разработчика, позволяющими убедиться в том, что приложение работает корректно.
- Подождите, пока отладчик. Этот пункт остается неактивным, пока вы не выберет приложение для отладки. Когда оно установлено и выбрано, то настройка просто не позволяет выбранному приложению запуститься до тех пор, пока не включится отладчик. Еще один пункт, который нужен разработчикам, но бесполезен для большинства пользователей.
- Проверять для USB. Позволяет Google сканировать приложения, которые вы поставили через ADB, на предмет вредоносного поведения. Хорошая вещь.
- Показывать касания. Выбирая этот пункт, вы будете видеть визуальный эффект, подтверждающий регистрацию касания экрана.
- Местоположение указателя. Эта настройка размещает в верхней части экрана строку, в которой выводятся координаты точки экрана, которой коснулись последней.
- Показать обновления экрана. Заставляет край «окна» вспыхивать, когда происходит обновление контекста. Раздражает безумно.
- Показывать границы макета. Отмечает края элементов в окне диалога для того, чтобы вы знали, куда нужно нажать, чтобы активировать его. Попробуйте – и немедленно выключайте.
- Написание справа налево. Изменяет ориентацию экрана для поддержки языков с правосторонним написанием
- Анимация окна: масштаб. Устанавливает скорость воспроизведения анимации окна. Чем меньше число, тем быстрее.
- Анимация перехода: масштаб. Устанавливает скорость воспроизведения анимации при переходе. Опять же, чем меньше, тем быстрее.
- Эмуляция дополнительных дисплеев. Эта настройка позволяет разработчикам имитировать различные размеры экрана. Не самая надежная вещь.
- Рендеринг принудительно. Заставляет приложения использовать аппаратный двухмерный рендеринг, если они были написаны так, чтобы не использовать его по умолчанию. Иногда творит чудеса. Иногда отправляет все к чертям. Будьте бдительны.
- Показать обновления окна. С этой настройкой любая отрисовка, производимая графической подсистемой, получает красную подсветку.
- Показывать аппаратные обновления. Выделяет аппаратные уровни зеленым при обновлении. Зачем это нужно — можете почитать здесь http://www.curious-creature.org/2013/09/13/optimizing-hardware-layers/ (на английском).
- Отладка наложения. Наложение происходит каждый раз, когда приложение запрашивает систему на отрисовку чего-либо поверх чего-то иного. Эта настройка позволяет вам видеть, когда и где это происходит, чтобы видеть, в чем проблема.
- Включить 4х MSAA. Эта настройка принудительно включает множественную выборку сглаживания (MSAA). Как и с любым другим графическим ускорителем, чем больше сглаживания, тем лучше все смотрится. Но скорость работы при этом падает.
- Строгий режим. Эта настройка заставляет экран мигать, когда приложение использует главный поток для выполнения длительной и интенсивной операции.
- Выводить использование ЦП. Размещает в правом верхнем углу небольшое окно с информацией о центральном процессоре и его использовании. Забавная игрушка.
- Профиль обработки GPU. Эта настройка может либо рисовать график на экране, либо писать его в файл. График — визуальное отображение загрузки работы графического адаптера. Еще одна вещь, на которую интересно посмотреть.
- Включить трассеровку OpenGL. Настройка, позволяющая следить за ошибками OpenGL и помещающая их в специальный файл лога по вашему выбору. Ничего такого, что стоило бы трогать большинству пользователей.
- Не сохранять операции. Эта настройка уничтожает любое приложение, как только вы закрываете его окно. Ничего хорошего из этого не выйдет, что бы там на форумах ни писали.
- Фоновые процессы. Позволяет задавать в настройках количество процессов, которые могут одновременно работать в фоне. Еще одна вещь, которую большинству из нас не стоит трогать слишком часто. Если вообще стоит.
- Показать все ANR. Эта настройка заставляет все процессы показать сообщение «Приложение не отвечает», если приложение зависло, включает фоновые процессы, которые не запускаются пользователем. Полезно, если одно приложение мешает нормально работать другому.
Понятно, что большинству пользователей все эти настройки ни на что не сдались. Кроме того, лезть туда и нажимать на пункты меню ради самого процесса — не лучшая идея. Но всегда стоит знать, что вообще можно сделать, хотя бы и просто для того, чтобы не делать этого никогда.
Надеемся, что наш рассказ просветил вас немного по вопросу этих настроек и опций, записанных непонятными словами. Кстати, в зависимости от выбранного языка системы, производителя и версии ОС Android, набор пунктов может несколько отличаться разделами и их названиями.
Источник