Что делать, если в приложении андроид произошла ошибка, ошибки в приложениях на андроиде. Делаем простейший сборщик ошибок для Android

При разработке приложения неизбежно приходится сталкиваться с ошибками в коде и/или окружении. И очень печально когда подобные ошибки встречаются не на тестовом телефоне/эмуляторе а у живых пользователей. Еще печальнее если это не ваш друг бета-тестер и толком никто не может объяснить что и где свалилось.

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

Что же делать? На помощь приедет возможность языка Java обрабатывать исключения (Exceptions), в том числе и непойманные (unhandled).

Класс Thread имеет статический метод setDefaultUncaughtExceptionHandler . Данный метод позволяет установить собственный класс-обработчик непойманных исключений. Класс-обработчик должен имплементировать интерфейс Thread.UncaughtExceptionHandler . Каркас обработчика может выглядеть примерно так:
public class TryMe implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread thread, Throwable throwable) { Log.d("TryMe", "Something wrong happened!"); } }
Единственный метод принимает на вход Thread - поток, в котором произошло исключение, и Throwable - само исключение. Приведенная выше реализация просто выводит в лог сообщение без каких либо деталей… Попробуем воспользоваться…
public class MainActivity extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { Thread.setDefaultUncaughtExceptionHandler(new TryMe()); Integer a=1; if(true) a=null; int x = 6; x=x/a; // Exception here! } }
После запуска вышеприведенного кода мы (ура!) получим сообщение в логе… и черный экран. Установив наш собственный обработчик мы удалил штатный обработчик ОС Android и теперь нам больше не предлагают закрыть приложение.

Исправим положение
public class TryMe implements Thread.UncaughtExceptionHandler { Thread.UncaughtExceptionHandler oldHandler; public TryMe() { oldHandler = Thread.getDefaultUncaughtExceptionHandler(); // сохраним ранее установленный обработчик } @Override public void uncaughtException(Thread thread, Throwable throwable) { Log.d("TryMe", "Something wrong happened!"); if(oldHandler != null) // если есть ранее установленный... oldHandler.uncaughtException(thread, throwable); // ...вызовем его } }
Теперь мы видим и сообщение в логе, и привычное системное сообщение.

Неудобно устанавливать обработчик в Activity. Хоть он и будет установлен а все потоки, но Activity может быть несколько и несколько же стартовых. А еще могут быть сервисы… В этом случае лучше всего устанавливать обработчик при инициализации приложения. Примерно вот так:
public class MyApplication extends Application { @Override public void onCreate() { Thread.setDefaultUncaughtExceptionHandler(new TryMe()); super.onCreate(); } }
При этом нужно не забыть прописать новый класс приложения в манифест. Примерно вот так:
Теперь при старте приложения (не важно какого его компонента) будет установлен обработчик исключений.

Конечно выводить сообщение в лог это не серьезно. Нужно собирать больше информации. Какая версия приложения? Какое исключение не обработано? Какое другое исключение привело к выбросу фатального? В каком потоке? Какой был стэк? Всю эту информацию можно получить. Код простейшего обработчика исключений получающий и сохраняющий на SD-карту всю вышеуказанную информацию размещен на GitHub .

Приведенная реализация сохраняет информацию об необработанном исключении в файл на SD-карте в папку /Android/data/your.app.package.name/files/ (так велит Dev Guide) в файлах вида stacktrace-dd-MM-yy.txt. Для работы в манифесте приложения требуется разрешение WRITE_EXTERNAL_STORAGE.

Естественно это не единственное подобное решение.

Flurry - аналитика для мобильных приложений, содержит свой обработчик ошибок. ACRA - библиотека для Android, собирает данные об ошибках и постит их на GoogleDocs. Android-remote-stacktrace - аналогичная библиотека, шлет данные на пользовательский скрипт-приемник. Также много полезного можно получить

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

Тем не менее, многие пользователи не в курсе, что огромное количество функций их Андроид-устройства остаются скрытыми. Речь идет о возможности отладки устройства и некоторых других функциях, которые возможны только в «режиме разработчика», который в большинстве случаев отключен и скрыт от глаз пользователя. О том, как его включить и какие возможности он предоставляет, мы расскажем в данном руководстве.

После активации данного режима в меню настроек Андроида появляется новый раздел под названием «Для разработчиков». Он открывает пользователю новые возможности. Некоторые из них, которые могут быть полезны даже простому пользователю, рассмотрим далее:

  • Размер буфера журнала – предоставляет возможность выбора объема памяти ;
  • Ускорение работы GPU – активирует обработку двухмерной графики;
  • Показывать загрузку ЦП – выводит экран с информацией о текущей загрузке центрального процессора;
  • Подключение USB – выбор режима работы устройства при подсоединении его к ПК по USB;
  • Отладка по USB – задействует режим отладки при подсоединении вашего Android к ПК с помощью кабеля.
  • Фиктивное местоположение устройства – позволяет заставить приложения «думать», что вы находитесь в другой точке мира.

Активация

Включить режим для разработчика несложно. Для этого нужно:

Перечень доступных настроек

Теперь разберем функции раздела для разработчиков более подробно.

Будьте внимательны: при работе с настройками в режиме разработчика из-за неопытности пользователей может случиться сбой в работе устройства и даже произойти потеря данных. Поэтому рекомендуется включать и отключать те или иные функции с осторожностью.

  • Создание отчета об ошибках. Опция предназначена для отправки отчета об ошибках. Файлы для отправки создаются в течение пары минут.
  • Пароль для резервного копирования. Данный пункт дает возможность использовать ADB для создания резервного копирования данных на ПК. Для создания копии, требуется обязательный ввод пароля.
  • Активный режим. Если эта опция включена, экран устройства при его подключении к ПК не будет гаснуть. Стоит использовать с осторожностью, поскольку длительная работа экрана может его испортить.
  • Выбор рабочего модуля. Инструмент для выбора ART или Davlik. Не стоит ничего менять, если вы не знаете, для чего они необходимы.
  • Включение журнала трансляций операций HCI Bluetooth. Данная функция полезна только для разработчиков, поскольку позволяет вести перехват и анализ пакетов Bluetooth. После включения данной опции, пакеты будут сохраняться в файле «btsnoop_hci.log». Файл можно открыть и проанализировать в программе «Wireshark» или аналогичной.
  • Статистика процессов. Показывает информацию о процессах, которые в данный момент запущенны на устройстве. Для простого пользователя пользы не представляет.
  • Отладка USB. Позволяет подключать устройство к ПК через ADB.
  • Отзыв авторизации отладки USB. При первой отладке устройства по USB, его требуется авторизовать, используя для этого ключи. С помощью данной настройки, можно отменить это действие и повторить его еще раз.
  • Отчеты об ошибках. Опция очень полезна для тестирования приложений. При помощи зажатой кнопки питания можно проводить сбор и отправку отчетов о сбоях и ошибках.
  • Фиктивные местоположения. Позволяет вручную установить местоположение. Используется некоторыми разработчиками для тестирования приложений с привязкой по геоданным.
  • Приложения для отладки. Можно вручную задать приложения для отладки. Помогает разработчикам убедиться в корректной работе кода приложения.
  • Проверка по USB. С помощью данной опции можно проводить сканирование поставленных через ADB приложений и выявлять вредоносную активность.
  • Отображение касаний. Если опция активирована, на экране будут появляться визуальные эффекты, отображающие прикосновения к экрану.
  • Местоположение указателя. Выводит на экран координаты последней точки прикосновения к экрану.
  • Отображение границ макета. Отображение контуров элементов в диалоговых окнах. Позволяет более точно определить, куда нужно нажимать, чтобы активировать элемент на экране.
  • Написание справа налево. Включает изменение ориентации экрана. Опция требуется для работы с правосторонним вводом символов (необходимо для некоторых языков).
  • Эмуляция дополнительного дисплея. Полезно только для разработчиков, поскольку позволяет эмулировать разные размеры дисплея.
  • Принудительный рендеринг. Включает использование приложениями аппаратного двухмерного рендеринга. В некоторых случаях, может дать прибавку производительности, в некоторых наоборот, все испортить. Лучше использовать с осторожностью.
  • Отладка наложения. Позволяет видеть наложения, которые происходят в момент отрисовки графической системой изображений поверх чего-либо.
  • Активация 4х MSAA. Принудительно активирует улучшенное сглаживание. После активации заметно ухудшается производительность устройства.
  • Отобразить нагрузку ЦП. Выводит на экран информацию о текущей нагрузке центрального процессора.
  • Установка профиля GPU. Опция позволяет сохранять в отдельный файл график загрузки графической системы.
  • Трассеровка Open GL. Позволяет сохранять все ошибки OpenGL в отдельный файл.
  • Фоновые процессы. Опция позволяет вручную задать количество одновременно работающих в фоне процессов.
  • Показ ANR. Включает отображение системных сообщений при зависании приложений. Полезно если приложения конфликтуют между собой.

Деактивация

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

Чтобы полностью убрать функцию из меню, необходимо проделать следующие действия:

Заключение

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

  • Устройства - количество устройств, на которых наблюдался данный крэш хотя бы один раз за выбранный период времени.
  • Крэши по дням - количество появления крэша за выбранный период времени.
  • % от всех устройств - доля устройств, с которых был отправлен крэш, от общего числа устройств, запускавших приложение за выбранный период времени.

Просмотр крэш лога

Чтобы просмотреть описание лога, нажмите кнопку .

Также вы можете получить статистическую информацию об устройствах, с которых были отправлены сообщения о крэшах. Для просмотра статистики нажмите на название лога. По умолчанию отобразятся данные, сгруппированные по версии приложения. Вы можете выбрать другую группировку (например, Производитель , Город , Оператор и т. д.).

Крэши могут приходить обфусцированными с устройств на Android и Windows и десимволизированными с устройств на iOS. Из таких крэш логов не получится извлечь данные, которых было бы достаточно для анализа ситуации. Чтобы просмотреть описание лога, нажмите кнопку .

Чтобы деобфусцировать или символизировать лог, нажмите на его название и перейдите к подробной статистике. Затем в зависимости от платформы вашего приложения выполните действия:

Операции с крэш логом

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

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


Описание крэш лога можно выгрузить в TXT-файл, нажав кнопку , а затем - кнопку Сохранить . При этом, если вы добавили комментарий, он не сохранится в TXT-файле.

Отчет «Ошибки»

Отчет отображает ошибки, отправленные приложением через AppMetrica SDK, а также статистическую информацию о них. Подробно об отправке сообщений об ошибках см. в разделе Руководство разработчика → AppMetrica SDK (Android | iOS | Windows).

Отчет поддерживает сегментирование данных и отображает следующие метрики:

  • Устройства - количество устройств, с которых были отправлены сообщения об ошибках хотя бы один раз за выбранный период времени.
  • Ошибки - количество появления ошибки за выбранный период времени.

Чтобы просмотреть описание ошибки, нажмите кнопку .

Также вы можете получить статистическую информацию об устройствах, с которых были отправлены сообщения об ошибках. Для просмотра статистики нажмите на название ошибки. По умолчанию отобразятся данные, сгруппированные по версии приложения. Вы можете выбрать другую группировку (например, Производитель , Город , Оператор и т. д.).

Описание ошибки можно выгрузить в TXT-файл, нажав кнопку , а затем - кнопку Сохранить .

Экспорт данных

Данные из отчета можно экспортировать, выбрав элемент из выпадающего списка Экспорт над графиком. Данные экспортируются с учетом выбранных настроек отчета: сегментации, группировки, временного периода.

Список содержит следующие элементы:


  • Экспортировать в CSV - экспортирует данные из таблицы в формате CSV .
  • График в PNG - экспортирует изображения графика в формате PNG .
  • График в CSV - экспортирует данные из графика в формате CSV .
  • Скопировать API-запрос таблицы - выводит текст запроса для выгрузки данных из таблицы с помощью API отчетов .
  • Скопировать API-запрос графика - выводит текст запроса для выгрузки данных графика с помощью API отчетов . Полученный запрос можно использовать для построения собственного дашборда или создания автоматических скриптов выгрузки данных.

    Примечание. Если вы получаете текст запроса впервые, убедитесь, что браузер не заблокировал всплывающее окно авторизации. В окне авторизации разрешите AppMetrica доступ к данным.

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

Все действия проводятся на смартфоне Nexus 4, который работает под управлением ОС Android 4.4. Комментирование каждого пункта меню основано на его же описании. Если читатель знает более подробную информацию о какой-то команде - делитесь опытом. Не забывайте, все изменения в этом режиме вы вносите на свой страх и риск!

Для того чтобы включить отоброжение пункта "Для разработчиков" в списке настроек, нужно провести следующие действия:

  1. Заходим в меню настроек
  2. Переходим в пункт О телефоне
  3. Находим строку Номер сборки
  4. Нажимаем по нему семь раз.

Если появилось вот такое уведомление, то у нас все получилось!

Меню "Для разработчиков" теперь будет находится в списке в настройках гаджета. На Android 4.4 пункт размещен между "Печать" и "О телефоне"!

Вот список и описание всех функций, которое дает нам скрытое меню:

  1. Создание отчета об ошибке - кнопка неактивна при нормальной работе устройства.
  2. Пароль для резервного копирования - возможность защитить полные резервные копии данных смартфона или планшета. Пароль вводится вручную и создается самым пользователем.
  3. Не выключать экран - активация этого действия приведет к постоянной подсветки экрана в процессе зарядки устройства.
  4. Выберите среду - доступны для выбора две рабочие среды: Dalvik и ART. Последняя более новая и призвана повысить уровень производительности приложений и устройства в целом. Включить журнал трансляции - команда служит для сохранения всех пакетов HCI Bluetooth в файле.
  5. Статистика процессов - выполнение этой операции позволит вести статистику запущенных процессов.
  6. Отладка по USB - включает режим отладки при подключении к компьютеру при помощи USB-кабеля.
  7. Запретить доступ для отладки с помощью USB на всех компьютерах, на которых вы входили в аккаунт .
  8. Отчеты об ошибках - кнопка неактивна в штатном режиме. При активации, устройство начнет отображать в меню опцию отправки отчета об ошибке.
  9. Фиктивное местоположение - удивительная функция, которая умеет маскировать текущее местоположение владельца с гаджетом и выдавать ложные координаты.
  10. Выберите приложение для отладки - можно задать определенные приложения для возможности их отладки.
  11. Подождите пока подключится - приложение ожидает подключения отладчика в штатном режиме. Кнопка неактивна.
  12. Установленные через USB - функция позволяет проверять на безопасность приложения, устанавливаемые через ADB/ADT. Кнопка неактивна.
  13. Сертификация беспроводных … - отображает параметры сертификации беспроводных мониторов.
  14. Показывать нажатия - при активации кнопки, реализуется отображения точки в местах нажатия на экран.
  15. Отображать касания - проводится визуализация на экране нажатия и жестов.
  16. Показ. обнов. поверхности - осуществляется подсвечивание окон полностью при их обновлении.
  17. Показывать границы элементов - обеспечивает отображение границ клипа, поля и т.д.
  18. Написание справа налево - отображает написание текстов справа налево для всех языков.
  19. Окно: масштаб - установка масштаба анимации от 0,5х до 10х. Также можно отключить анимацию вообще.
  20. Переход: масштаб - установка масштаба перехода от 0,5х до 10х. Отключение анимации также возможна.
  21. Скорость анимации - можно задать скорость анимации гаджета в интервале от 0,5х до 10х. Анимацию можно отключить вообще.
  22. Эмуляция дополнительных экранов - интересная опция, которая может провести эмуляцию дополнительных экранов на основном физическом экране устройства. Включив эту опцию, пользователь увидит еще один экран, который продублирует основной. Размеры дополнительного экрана настраиваются самостоятельно.
  23. GPU-ускорение - можно поставить галочку и, тем самым, всегда использовать GPU для двухмерного рисования.
  24. Показывать обновление экрана - поставленная галочка обеспечит подсветку области экрана при отрисовке GPU.
  25. Показывать аппаратные обновления - задействование этой функции выделит аппаратные уровни зеленым при обновлении.
  26. Отладка наложения - этот пункт содержит три возможных варианта для выбора: 1) выкл.; 2) показывать области наложения; 3) выделять области определенного цвета; 4) показывать число объектов.
  27. Отладить операции непрямоугольного усечения - на этом этапе можно провести три действия: 1) отключить опцию; 2) непрямоугольное сечение; 3) тестирование команды рисование зеленым.
  28. Включить 4х MSAA - поставив галочку, пользователь (или уже разработчик) включает 4х MSAA в приложениях OpenGL ES 2.0.
  29. Отключить аппаратные наложения - активация пункта повлечет за собой постоянное использование GPU при компоновке экрана.
  30. Включен строгий режим - данный режим будет подсвечивать экран Android-устройства во время длительных операций.
  31. Показывать загрузку ЦП - при активации этого действия, смартфон отобразит на своем экране дополнительное окошко с графическим отображением текущей загрузки ЦП. Запись времени работы GPU - название данного пункта говорит само за себя.
  32. Включить трассировку OpenGL - имеет четыре возможным варианта развития событий: 1) нет данных; 2) Logcat; 3) Systrace; 4) Список вызовов в glGetError/
  33. Не сохранять действий - данный пункт меню относится к приложениям, активация его приведет к удалению сводки действий после их завершения.
  34. Лимит фоновых процессов - полезная функция. Она способна ограничить количество работающих приложений в фоновом режиме.
  35. Все ANR - птичка, поставленная напротив данного пункта обеспечит уведомления пользователя о том, что приложение лагает (авт.) или не отвечает.