Все anr android что это
Все о функциях разработчика в вашем телефоне
Константин Иванов
Настройки, которые используются для отладки и для разработки приложений, спрятаны в вашем телефоне – спрятаны в прямом смысле слова. Многие из нас идут в соответствующий раздел меню, чтобы запустить отладку USB или переключиться к рабочему модулю ART, но кроме этого, здесь имеется целый список настроек. Большая часть никогда вам не понадобится, но разве не интересно узнать, что скрывается в недрах вашего устройства?
«Разблокируем» функции разработчика в телефоне
Как говорилось выше, эти функции изначально скрыты. Это имеет смысл, поскольку найти их просто, а большинству людей они попросту не нужны. Для того, чтобы добраться до них, идем в раздел «Об устройстве» и ищем там пункт «Номер сборки». После пяти быстрых тапов появляется диалоговое окно – теперь устройство считает вас разработчиком. Только попробуйте ничего не испортить, ладно? Ну, или делайте что хотите – тоже вариант. Так или иначе, возможность заставить ваш телефон перестать работать всегда имеется.
А теперь посмотрим на предложенные функции повнимательнее.
Настройки
Понятно, что большинству пользователей все эти настройки ни на что не сдались. Кроме того, лезть туда и нажимать на пункты меню ради самого процесса — не лучшая идея. Но всегда стоит знать, что вообще можно сделать, хотя бы и просто для того, чтобы не делать этого никогда.
Надеемся, что наш рассказ просветил вас немного по вопросу этих настроек и опций, записанных непонятными словами. Кстати, в зависимости от выбранного языка системы, производителя и версии ОС Android, набор пунктов может несколько отличаться разделами и их названиями.
В чем разница между ANR и сбоем в Android?
Я искал в Интернете, что такое ANR. И я изучил эти ссылки. Но я не получаю подробностей о сбоях в Android.
Может ли кто-нибудь сказать мне разницу между ANR (Android, не отвечающим) и сбоем в Android?
ANR означает «Применение».
ANR будет возникать, если вы выполняете процесс в потоке пользовательского интерфейса, который занимает много времени, обычно около 5 секунд. За это время GUI (графический интерфейс пользователя) закроется, что приведет к тому, что пользовательские нажатия не будут действовать. По истечении 5 секунд, если поток по-прежнему не восстановлен, отображается диалоговое окно ANR, информирующее пользователя о том, что приложение не отвечает, и предоставит пользователю возможность либо ждать, в надежде, что приложение будет В конечном итоге восстановить или закрыть приложение.
Авария – это когда в приложении было исключено исключение, которое не было обработано. Например, если вы попытаетесь установить текст компонента EditText, но EditText имеет значение NULL, и нет инструкции try catch, чтобы поймать исключение, которое ваше приложение выйдет из строя и будет принудительно закрыто. Пользователь не увидит причину сбоя, им будет показан диалог, в котором сообщается, что приложение неожиданно отключилось и предоставит им возможность отправить отчет об ошибке. В этом примере, если вы хотите посмотреть в отчете об ошибке, вы увидите ошибку, вызванную java.lang.NullPointerException.
Надеюсь это поможет.
ANR (приложение не отвечает) связано с long running task in Main Thread с long running task in Main Thread сроком long running task in Main Thread (поток пользовательского интерфейса). Если основной поток остановлен более 5 секунд, вы получаете ANR.
Crash вызваны exception and error например Nullpoint, classNotfound, typecast, parse error и т. Д. ANR также вызывает сбой приложения.
Примечание. Никогда не запускайте долго выполняемую задачу в потоке пользовательского интерфейса.
Ссылка ANR
ANR означает Application Not Responding, что означает, что ваше приложение больше не регистрирует события в потоке пользовательского интерфейса, потому что там выполняется длительная работа
ANR означает приложение, не отвечающее, и оно возникает, когда длительная работа происходит в главной нити ……
Crash вызваны исключением и ошибкой, например Nullpoint,
ANR для ex: если вы загружаете огромные данные в поток ui, другие другие возможности, такие как недостаточная память и т. Д., Это произойдет. Вероятно, это приводит к сбоям в android, мы не можем сказать, что оба они одинаковы
Приложение не отвечает (ANR):
ANR будет отображаться в следующих условиях:
Ответ на входное событие (например, нажатие клавиши или экранное нажатие) в течение 5 секунд.
Трансляционный приемник не закончил выполнение в течение 10 сек.
Создайте другой рабочий поток для длительных операций, таких как операции с базами данных, сетевые операции и т. Д.
Усиление реакции: в приложении для Android обычно от 100 до 200 мс является пороговым значением, за которым пользователь будет чувствовать, что приложение работает медленно. Ниже приведены советы, по которым мы можем показать, что приложение более отзывчивое.
Показывать диалог выполнения, когда вы выполняете какую-либо фоновую работу, и пользователь ждет ответа.
Для игр специально выполняйте вычисления для ходов в рабочем потоке.
Crash: авария является необработанным условием в приложении, и оно будет принудительно закрыть наше приложение. Некоторые из примеров сбоев похожи на исключение Nullpointer, исключение из-за незаконного состояния и т. Д.
Это может произойти по многим причинам, например, если приложение блокирует некоторые операции ввода-вывода в потоке пользовательского интерфейса, поэтому система не может обрабатывать входящие события ввода пользователя. Или, возможно, приложение тратит слишком много времени на создание сложной структуры в памяти или вычисление следующего движения в потоке пользовательского интерфейса.
Блокирование основного потока не приведет к сбою, но появится всплывающее окно, позволяющее пользователям убивать приложение через 5 секунд.
Но для Crash основной причиной являются человеческие ошибки. В большинстве случаев сбой приложений происходит из-за ошибки кодирования / дизайна, сделанной человеком
Исключение нулевого указателя
Пример :
Это обычное явление, когда программист делает ссылку на объект или переменную, которая не существует, в основном создавая ошибку с нулевым указателем.
Если у вас плохое соединение, это также может привести к сбою ваших приложений. Приложение может также иметь проблемы с управлением памятью.
Пожалуйста, см. Мой ответ для типа конкретного исключения для Android, которое может привести к сбою.
Android-как я могу исследовать ANR?
есть ли способ узнать, где мое приложение бросило ANR (приложение не отвечает). Я взглянул на следы.txt-файл в /data, и я вижу трассировку для своего приложения. Это то, что я вижу в трассировке.
10 ответов:
ANR происходит, когда какая-то длительная операция происходит в «главном» потоке. Это поток цикла событий, и если он занят, Android не может обрабатывать дальнейшие события GUI в приложении и, таким образом, вызывает диалог ANR.
теперь, в трассировке вы опубликовали, основной поток, кажется, все в порядке, нет никаких проблем. Это простаивания в очереди, ждет еще одно сообщение сюда. В вашем случае ANR, скорее всего, была более длительной операцией, а не чем-то, что заблокировал поток навсегда, поэтому поток событий восстановился после завершения операции, и ваша трассировка прошла после ANR.
обнаружение, где происходят ANRs, легко, если это постоянный блок (например, тупик, приобретающий некоторые блокировки), но сложнее, если это просто временная задержка. Во-первых, просмотрите свой код и найдите vunerable пятна и длительные операции. Примеры могут включать использование сокетов, блокировок, спящих потоков и других операций блокировки из события нитка. Вы должны убедиться, что все это происходит в отдельных потоках. Если ничего не кажется проблемой, используйте DDMS и включите представление потока. Это показывает все потоки в вашем приложении, похожие на трассировку, которую вы имеете. Воспроизвести ANR, и обновить основной поток в то же время. Это должно показать вам точно, что происходит во время ANR
Вы можете включить StrictMode в API уровня 9 и выше.
StrictMode чаще всего используется для захвата случайного диска или сети доступ к основному потоку приложения, где выполняются операции пользовательского интерфейса полученные и анимации имеют место. Сохраняя основной поток вашего приложения отзывчивый, ты тоже запретить диалоги ANR от показа пользователям.
используя penaltyLog() вы можете посмотреть вывод АБР logcat в то время как вы используйте приложение, чтобы увидеть нарушения, как они происходят.
вам интересно, какая задача содержит поток пользовательского интерфейса. Файл трассировки дает вам подсказку, чтобы найти задачу. вам нужно исследовать состояние каждого потока
состояние потока
фокус на приостановлено, состояние монитора. Состояние монитора указывает, какой поток исследуется, и приостановленное состояние потока, вероятно, является основной причиной взаимоблокировки.
основные шаги исследования
трассировка не всегда содержит «ожидание блокировки». в в этом случае трудно найти главную причину.
Я изучал android в течение последних нескольких месяцев, поэтому я далек от эксперта, но я был очень разочарован документацией по ANRs.
большинство советов, похоже, направлены на то, чтобы избежать их или исправить их, слепо просматривая ваш код, что здорово, но я ничего не мог найти при анализе трассировки.
есть три вещи, которые вам действительно нужно искать с журналами ANR.
1) взаимоблокировки: когда поток находится в ожидании государство, вы можете посмотреть через детали, чтобы найти, кто это «heldby=». Большую часть времени он будет удерживаться сам по себе, но если он удерживается другой нитью, это, вероятно, будет знаком опасности. Иди посмотри на эту нить и посмотри, за что она держится. Вы можете найти петлю, которая является явным признаком, что что-то пошло не так. Это довольно редко, но это первый момент, потому что, когда это происходит, это кошмар
2) ожидание основного потока: Если ваш основной поток находится в состоянии ожидания, проверьте, удерживается ли он по другой нитке. Этого не должно произойти, потому что ваш поток пользовательского интерфейса не должен удерживаться фоновым потоком.
оба этих сценария означают, что вам нужно значительно переработать свой код.
3) тяжелые операции на основной поток: это наиболее распространенная причина ANRs, но иногда один из труднее найти и исправить. Посмотрите на основные детали потока. Прокрутите вниз трассировку стека и пока не увидите классы, которые вы узнаете (из вашего приложения). Посмотрите на методы в трассировке и выяснить, если вы делаете звонков внутри сети, БД и т. д. в таких местах.
наконец, и я прошу прощения за бесстыдно подключив свой собственный код, вы можете использовать анализатор журнала python, который я написал в https://github.com/HarshEvilGeek/Android-Log-Analyzer это будет проходить через ваши файлы журналов, открывать файлы ANR, находить взаимоблокировки, находить ожидающие основные потоки, находить неперехваченные исключения в журналах агентов и печатать все это на экране относительно легко читать. Читать ReadMe файл (который я собираюсь добавить), чтобы узнать, как его использовать. Это помогло мне тонну на прошлой неделе!
всякий раз, когда вы анализируете вопросы синхронизации, отладка часто не помогает, так как замораживание приложения в точке останова сделает проблему уйти.
лучше всего, чтобы вставить много протоколирования вызовов (Log.XXX ()) в различные потоки и обратные вызовы приложения и посмотреть, где задержка находится. Если вам нужен stacktrace, создайте новое исключение (просто создайте экземпляр) и запишите его.
что вызывает ANR?
как правило, система отображает ANR, если приложение не может ответить на ввод пользователя.
в любой ситуации, когда ваше приложение выполняет потенциально длительную операцию, вы не должны выполнять работу в потоке пользовательского интерфейса, а вместо этого создать рабочий поток и выполнять большую часть работы там. Это сохраняет поток пользовательского интерфейса (который управляет циклом событий пользовательского интерфейса) и предотвращает вывод системы о том, что ваш код заморожен.
Как избежать ANRs
приложений Android обычно полностью работают на один поток по умолчанию «поток пользовательского интерфейса» или «основной поток»). Это означает, что все, что ваше приложение делает в потоке пользовательского интерфейса, которое занимает много времени, может вызвать диалоговое окно ANR, потому что ваше приложение не дает себе возможности обрабатывать входные события или передачи намерений.
поэтому любой метод, который выполняется в потоке пользовательского интерфейса, должен выполнять как можно меньше работы этот поток. В частности, мероприятия должны делать как можно меньше для настройки в ключевых методах жизненного цикла, таких как onCreate() и onResume(). Потенциально длительные операции, такие как операции с сетью или базой данных, или вычислительно дорогостоящие вычисления, такие как изменение размера растровых изображений, должны выполняться в рабочем потоке (или в случае операций с базами данных с помощью асинхронного запроса).
код: рабочий поток с классом AsyncTask
Код: Выполнить Рабочий поток
чтобы выполнить этот рабочий поток, просто создайте экземпляр и вызовите execute ():
Русские Блоги
Подробный анализ Android ANR
анализ файла трассировки
Краткое понимание ANR
Информация о стеке функций каждого процесса приложения и системного процесса выводится в файл /data/anr/traces.txt,
Причина использования каталога pull заключается в том, что некоторые мобильные телефоны будут выводить файлы эксклюзивных трассировок для различных приложений, поэтому в каталоге / data / anr будет множество файлов трассировок. Как правило, сторонняя разработка приложений заботится только о своих собственных приложениях и не имеет привилегий root. Следовательно, только файл трассировок может быть проанализирован для определения местоположения anr, и три общие проблемы ANR могут быть решены в соответствии с модулем и страницей, которые воспроизводит проблема, в сочетании с файлом трассировок. Откройте файл трассировки и найдите свое собственное имя пакета приложения, чтобы найти классы и методы, которые вызывают anr в передней и задней позициях. следующим образом:
1. Основной поток заблокирован, и в течение 5 секунд нет ответа на входные события, такие как события onClick. Это основной тип проблем ANR. Обычно разработчики не допускают таких ошибок. Все трудоемкие операции будут обрабатываться отдельными потоками. Если вы не посмотрите на свой собственный код, вы будете знать, как с ним бороться.
Анализ информации файла трассировки
// В начале отображаются номер процесса, момент времени появления ANR и имя процесса
Как избежать ANR при разработке сторонних приложений
Три распространенные ситуации при разработке сторонних приложений были подробно представлены в предыдущей статье. Идея избежать anr ясна. Краткое резюме:
2. Когда broadCastReceiver должен выполнять сложные операции, вы можете запустить IntentService или JobIntentService в методе onReceive (), чтобы сделать это.
4. Избегайте неподходящих ситуаций, таких как синхронизация / тупик, тупик и т. Д. На этапе разработки и написания кода
ANR в разработке системы Android
Для разработчиков системы недостаточно только файла /data/anr/traces.txt. Поскольку, несмотря на наличие anr, в файле трассировки нет журнала anr или в файле трассировки есть журнал, но причина проблемы anr не может быть найдена.
ANR оказывает относительно большое влияние на стабильность системы, и испытательный центр будет рассматривать ANR как важный случай для стабильности системы. Разработчики системы обычно используют инструменты и системные журналы для анализа. Anr сообщается в модуле, за который вы отвечаете, но причина anr, вероятно, кроется в других модулях, особенно при выполнении тестов стабильности. Трудно исследовать отдельные проблемы ANR. В конце концов, сценарии все еще несколько отличаются от ручных операций, и такие проблемы, как фрагментация памяти, сбои оборудования и т. Д., Невозможно исследовать на базовом прикладном уровне. По крайней мере, это трудно выяснить отдельным людям. Это может потребовать внимания команды (например, ядра, BSP) ), даже обратную связь с производителем решить.
Согласно моему опыту, следующие ситуации будут вызывать ANR:
Конечно, проблема ANR в предыдущем приложении также появится. Разработка системы относительно сложна, и невозможно разобраться в общих случаях. Я могу говорить только о том, как анализировать после ANR.
Я лично много работаю на платформе MTK. Платформа имеет свои собственные инструменты и документы. В принципе, вы можете выполнять эту работу, если вы посмотрите на документ и изучите его.
Используйте инструмент GAT
В mtklog есть файл aee_exp, в нем два файла, один ZZ_INTERNAL, и есть только одно предложение, в котором говорится о том, какая ошибка была сообщена, номер процесса, в котором произошла ошибка, программа, в которой произошла ошибка, и время ошибки.
Другой файл называется db.01.JE. Этот файл содержит конкретную информацию о сообщении об ошибке и о хранении различных состояний машины, когда сообщается об ошибке, но этот файл можно открыть только с помощью программного обеспечения gat, специально созданного mtk.
Нажмите на него, чтобы найти самое важное сообщение об ошибке, описание информации очень прямое, и соответствующая программа может понять эту информацию
Загрузка процессора в течение периода времени до и после появления ANR
Если вы обнаружите, что iowait обеспечивает высокий процент использования ЦП при возникновении ANR, вы можете определить, какой процесс выполняет операции дискового ввода-вывода, посмотрев на большинство процессов.
Как анализировать ЛОГ
Сначала понять основной файл журнала
Многие журналы не перечислены, но это наиболее часто используемые. Посмотрите на основные файлы журнала. Во-первых, найдите номер процесса приложения и имя процесса ANR в файлах ZZ_INTERNAL, __exp_main.txt, фильтр am_anr в журнале событий, записанном в SYS_ANDROID_EVENT_LOG, и соответствуют номеру процесса. Этот журнал событий в основном указывает, какой класс или операция в настоящее время находятся в. Вы можете посмотреть на свой собственный код
SWT_JBT_TRACES также находит соответствующий номер процесса, чтобы проверить, не достаточно ли кучи, а поток заблокирован. Как правило, потоки блокируются, а загрузка процессора обычно низкая.
Распределение и использование связующего, отчет о диагностическом анализе
Русские Блоги
Подробный ANR оптимизации приложений для Android
Чтобы облегчить чтение, меня пригласили перенести серию статей по оптимизации производительности Android-приложений в исходные Nuggets.
Новую функцию «Сборник» в Nuggets можно использовать для создания серии эссе.
Давайте поговорим сегодня об ANR.
1, сталкивались ли вы с ANR
Во время использования Приложения вы могли столкнуться с такой ситуацией:
Поздравляем, это легендарный ANR.
1.1 Что такое ANR
1.2 Почему генерируется ANR
В Android за быстродействием приложения следят системные службы Activity Manager и Window Manager. Как правило, диалоговое окно ANR появляется в следующих двух ситуациях:
1.3 Как избежать ANR
Зная причину ANR, очень просто избежать ANR, всего одно правило:
Не выполняйте тяжелых операций в основном потоке (потоке пользовательского интерфейса).
На самом деле это связано с двумя проблемами:
2, анализ ANR
2.1 Получите файл трассировки, созданный ANR
При генерации ANR система сгенерирует файл traces.txt и поместит его в / data / anr /. Вы можете передатьadbКоманда для локального экспорта:
2.2 Анализ traces.txt
2.2.1 ANR, вызванный обычной блокировкой
Полученный файл tracs.txt обычно выглядит следующим образом:
Следующим образомGithubAppВ качестве примера возьмем код: ANR, созданный потоком принудительного сна.
Получите трассировочную информацию, все легко сказать.
Как в приведенной выше информации о трассировкеДобавлен комментарий на китайском языкеОн в основном объяснил, как анализировать файл трассировки:
Вышеупомянутая трассировка ANR относительно проста, и возможно, что вы не выполнили слишком трудоемких операций в основном потоке, но это все еще ANR. Это могут быть следующие две ситуации:
2.2.2 Полная загрузка процессора
Информация трассировки, которую вы видите сейчас, может содержать такую информацию:
Последнее предложение указывает:
Анализируя стек вызовов метода в это время, обычно обнаруживается, что метод имеет частые операции чтения и записи файла или чтения и записи базы данных в основном потоке.
2.2.3 Причина памяти
Фактически, память может вызвать ANR. Например, если в Приложении осталось мало памяти из-за утечки памяти, мы нажимаем кнопку, чтобы запустить большое изображение в качестве фонового действия, и ANR может быть сгенерирован. В это время информация трассировки может быть такой:
Как видите, свободной памяти осталось не так много.
2.2 Обработка ANR
Для трех различных ситуаций общая обработка выглядит следующим образом
Основной поток заблокирован
Создайте отдельный подпоток для обработки длительных блокирующих транзакций.
ЦП полностью загружен, ввод-вывод заблокирован
Блокировка ввода-вывода обычно означает, что чтение и запись файла или операции с базой данных выполняются в основном потоке, а также могут выполняться асинхронно, открывая дочерние потоки.
Недостаточно памяти
Увеличьте память виртуальной машины, используйте атрибут largeHeap, проверьте наличие утечек памяти (это обсуждается в главе об оптимизации памяти) и т. Д.
3, иди глубже
Никто не хочет решать проблему после того, как она возникла.
Разница между мастером и новичком заключается в том, что мастер знает, как избежать проблемы с самого начала. Итак, для проблемы ANR, какой уровень работы нам нужно сделать, чтобы ее избежать?
3.1 Какие места выполняются в основном потоке
3.2 Как можно использовать дочерние потоки
3.2.1 Запуск режима резьбы
Именно так Java реализует многопоточность.Существует два метода реализации, наследующие Thread или реализующие интерфейс Runnable:
Наследовать тему
Реализуйте интерфейс Runnable
3.2.2 Использование AsyncTask
Это уникальный способ для Android. AsyncTask, как следует из названия, означает асинхронную задачу.
3.2.3 HandlerThread
Способ объединения обработчика и потока в Android. Перед ним облако. По умолчанию handleMessage обработчика выполняется в основном потоке, но если я передаю цикл дочернего потока этому обработчику, handleMessage будет выполняться в этом дочернем потоке. В HandlerThread есть как раз такая комбинация:
3.2.4 IntentService
Служба работает в основном потоке, но IntentService работает в дочернем потоке.
Фактически, IntentService реализует модель HandlerThread + ServiceHandler.
Пример кода вышеупомянутого HandlerThread также взят изИсходный код IntentService.
3.2.5 Loader
Загрузчик данных, представленный в Android 3.0, может использоваться в Activity / Fragment. Он поддерживает асинхронную загрузку данных и может отслеживать источник данных для получения новых результатов при изменении данных. CursorLoader обычно используется для загрузки данных из базы данных.
3.2.6 Особое внимание
При использовании Thread и HandlerThread, чтобы эффект был лучше, рекомендуется установить приоритет Thread немного ниже:
Потому что, если вы не устанавливаете какой-либо приоритет, вы знаете, что создаваемый поток по умолчанию имеет тот же приоритет, что и поток пользовательского интерфейса. Поток с таким же приоритетом, планирование ЦП может по-прежнему блокировать ваш поток пользовательского интерфейса, Причина ANR.