Как отследить краш приложения
Иногда в приложении встречаются ошибки, которые нельзя увидеть даже после запуска. Например, код компилируется, проект запускается, но результат далёк от желаемого: приложение падает или вдруг появляется какая-то ошибка (баг). В таких случаях приходится «запасаться логами», «брать в руки отладчик» и искать ошибки.
Часто процесс поиска и исправления бага состоит из трёх шагов:
- Воспроизведение ошибки — вы понимаете, какие действия нужно сделать в приложении, чтобы повторить ошибку.
- Поиск места ошибки — определяете класс и метод, в котором ошибка происходит.
- Исправление ошибки.
Если приложение не падает и чтение логов ничего не даёт, то найти точное место ошибки в коде помогает дебаггер (отладчик) — инструмент среды разработки.
Чтобы посмотреть на логи и воспользоваться дебаггером, давайте напишем простое тестовое (и заведомо неправильное) приложение, которое даст нам все возможности для поиска ошибок.
Это будет приложение, которое сравнивает два числа. Если числа равны, то будет выводиться результат «Равно», и наоборот. Начнём с простых шагов:
- Открываем Android Studio.
- Создаём проект с шаблоном Empty Activity.
- Выбираем язык Java, так как его, как правило, знают больше людей, чем Kotlin.
Нам автоматически откроются две вкладки: activity_main.xml и MainActivity.java. Сначала нарисуем макет: просто замените всё, что есть в activity_main.xml, на код ниже:
Можете запустить проект и посмотреть, что получилось:
Теперь оживим наше приложение. Скопируйте в MainActivity этот код:
В этом коде всё просто:
- Находим поля ввода, поле с текстом и кнопку.
- Вешаем на кнопку слушатель нажатий.
- По нажатию на кнопку получаем числа из полей ввода и сравниваем их.
- В зависимости от результата выводим «Равно» или «Не равно».
Запустим приложение и введём буквы вместо чисел:
Нажмём на кнопку, и приложение упадёт! Время читать логи. Открываем внизу слева вкладку «6: Logcat» и видим:
Конечно, метод parseInt может принимать только числовые значения, но никак не буквенные! Даже в его описании это сказано — и мы можем увидеть, какой тип ошибки этот метод выбрасывает (NumberFormatException).
Здесь мы привели один из примеров. Типов ошибок может быть огромное количество, все мы рассматривать не будем. Но все ошибки в Logcat’е указываются по похожему принципу:
- красный текст;
- тип ошибки — в нашем случае это NumberFormatException;
- пояснение — у нас это For input string: "f";
- ссылка на строку, на которой произошла ошибка — здесь видим MainActivity.java:26.
Исправим эту ошибку и обезопасим себя от некорректного ввода. Добавим в наши поля ввода android:inputType="number", а остальной код оставим без изменений:
Теперь можем вводить только числа. Проверим, как работает равенство: введём одинаковые числа в оба поля. Всё в порядке:
На равенство проверили. Введём разные числа:
Тоже равно. То есть приложение работает, ничего не падает, но результат не совсем тот, который требуется. Наверняка вы и без дебаггинга догадались, в чём ошибка, потому что приложение очень простое, всего несколько строк кода. Но такие же проблемы возникают в приложениях и на миллион строк. Поэтому пройдём по уже известным нам этапам дебаггинга:
- Воспроизведём ошибку: да, ошибка воспроизводится стабильно с любыми двумя разными числами.
- Подумаем, где может быть ошибка: наверняка там, где сравниваются числа. Туда и будем смотреть.
- Исправим ошибку: сначала найдём её с помощью дебаггера, а когда поймём, в чём проблема, — будем исправлять.
И здесь на помощь приходит отладчик. Для начала поставим точки останова сразу в трёх местах:
Чтобы поставить или снять точку останова, достаточно кликнуть левой кнопкой мыши справа от номера строки или поставить курсор на нужную строку, а затем нажать CTRL+F8. Почему мы хотим остановить программу именно там? Чтобы посмотреть, правильные ли числа сравниваются, а затем определить, в какую ветку в нашем ветвлении заходит программа дальше. Запускаем программу с помощью сочетания клавиш SHIFT+F9 или нажимаем на кнопку с жучком:
Появится дополнительное окно, в котором нужно выбрать ваш девайс и приложение:
Вы в режиме дебага. Обратите внимание на две вещи:
- Точки останова теперь помечены галочками. Это значит, что вы находитесь на экране, где стоят эти точки, и что дебаггер готов к работе.
- Открылось окно дебага внизу: вкладка «5: Debug». В нём будет отображаться необходимая вам информация.
Введём неравные числа и нажмём кнопку «РАВНО?». Программа остановилась на первой точке:
Как видим, значения именно такие, какие мы и ввели. Значит, проблема не в получении чисел из полей. Давайте двигаться дальше — нам нужно посмотреть, в правильную ли ветку мы заходим. Для этого можно нажать F8 (перейти на следующую строку выполнения кода). А если следующая точка останова далеко или в другом классе, можно нажать F9 — программа просто возобновит работу и остановится на следующей точке. В интерфейсе эти кнопки находятся здесь:
Остановить дебаггер, если он больше не нужен, можно через CTRL+F2 или кнопку «Стоп»:
В нашем случае неважно, какую кнопку нажимать (F9 или F8). Мы сразу переходим к следующей точке останова программы:
Ветка правильная, то есть логика программы верна, числа firstInt и secondInt не изменились. Зато мы сразу видим, что подпись некорректная! Вот в чём была ошибка. Исправим подпись и проверим программу ещё раз.
Мы уже починили два бага: падение приложения с помощью логов и некорректную логику (с помощью отладчика). Хеппи пас (happy path) пройден. То есть основная функциональность при корректных данных работает. Но нам надо проверить не только хеппи пас — пользователь может ввести что угодно. И программа может нормально работать в большинстве случаев, но вести себя странно в специфических состояниях. Давайте введём числа побольше и посмотрим, что будет:
Не сработало — программа хочет сказать, что 1000 не равна 1000, но это абсурд. Запускаем приложение в режиме отладки. Точка останова уже есть. Смотрим в отладчик:
Числа одинаковые, что могло пойти не так? Обращаем внимание на тип переменной — Integer. Так вот в чём проблема! Это не примитивный тип данных, а ссылочный. Ссылочные типы нельзя сравнивать через ==, потому что будут сравниваться ссылки объектов, а не они сами. Но для Integer в Java есть нюанс: Integer может кешироваться до 127, и если мы вводим по единице в оба поля числа до 127, то фактически сравниваем просто int. А если вводим больше, то получаем два разных объекта. Адреса у объектов не совпадают, а именно так Java сравнивает их.
Есть два решения проблемы:
- Изменить тип Integer на примитив int.
- Сравнивать как объекты.
Не рекомендуется менять тип этих полей в реальном приложении: числа могут приходить извне, и тип лучше оставлять прежним. Изменим то, как мы сравниваем числа:
Всё работает. Наконец-то! Хотя… Давайте посмотрим, что будет, если пользователь ничего не введёт, но нажмёт на кнопку? Приложение опять упало… Смотрим в логи:
Опять NumberFormatException, при этом строка пустая. Давайте поставим точку останова на 26-й строке и заглянем с помощью отладчика глубже.
Нажмём F8 — и перейдём в глубины операционной системы:
Интересно! Давайте обернём код в try/catch и посмотрим ошибке в лицо. Если что, поправим приложение. Выделяем код внутри метода onClick() и нажимаем Ctrl+Alt+T:
Выбираем try / catch, среда разработки сама допишет код. Поставим точку останова. Получим:
Запускаем приложение и ловим ошибку:
Действительно, как и в логах, — NumberFormatException. Метод parseInt выбрасывает исключение, если в него передать пустую строку. Как обрабатывать такую проблему — решать исключительно вам. Два самых простых способа:
- Проверять получаемые строки first.getText().toString() и second.getText().toString() на пустые значения. И если хоть одно значение пустое — говорить об этом пользователю и не вызывать метод parseInt.
- Или использовать уже готовую конструкцию try / catch:
Теперь-то точно всё в порядке! Хотя профессиональным тестировщикам это приложение никто не отдавал: поищете ещё ошибки? :)
Продолжая тему полезных инструментов для Android-разработчиков, мы решили коснуться систем баг-репортинга. В процессе разработки мобильного приложения всегда возникают баги. Для того чтобы завести каждый баг, разработчики и тестировщики вынуждены проходить несколько рутинных стадий, которые можно сократить до нескольких шагов с помощью систем баг-репортинга.
Таким образом, системы баг-репортинга существенно упрощают процесс тестирования. Оценивая различные решения, представленные сейчас на рынке, мы сделали подборку наиболее полезных и удобных на наш взгляд инструментов. Выбор того или иного решения поможет вам оптимизировать процесс работы над проектом и сэкономить усилия в этом трудоёмком занятии.
Инструменты баг-репортинга с функцией
краш-уведомлений
1. InstaBug
InstaBug встраивается в мобильное приложение и помогает пользователям и тестировщикам оставлять свои отзывы и сообщать об ошибках непосредственно из приложения.
Требования для Android:
Требования для iOS:
- Приложение должно быть связано со следующими средами разработки: AVFoundation, CoreMotion, CoreGraphics, CoreTelephony, SystemConfiguration, UIKit
Характеристики:
Лицензия: Программа является платной.
2. Snaffu
Snaffu – встраиваемый в приложение инструмент баг-репортинга, который позволяет быстро находить и заводить развёрнутые баги. Отчётность о багах создается непосредственно внутри приложения.
Требования для Android:
- min SDK 15
- Android 5.0 для записи видео
- Support v4 library
Требования для iOS:
Характеристики:
- Совместимость с системами баг-трэкинга: JIRA, Asana, PivotalTracker
- Собственная встроенная система баг-трэкинга
- Любой может зарепортить баг, не только участники проектной команды (если необходимо)
- Автоматически предоставляет логи и всю информацию о девайсе
- Возможность выделить проблему, записать видео
- Краш-репорты – следующий репорт будет уже заполнен, т.е. приложение при запуске попросит отрепортить баг из-за которого оно упало
- Уведомления по email
- Работает в оффлайне и высылает репорты при появлении сети
Лицензия: Программа является платной.
3. Shaketobug
Требования:
Характеристики:
- Пользователи делают скриншот экрана приложения с багом, выделяют ошибку графически и отправляют в специальной форме с добавлением информации о девайсе.
- Разработчикам мобильных приложений доступна возможность кастомизировать некоторые аспекты библиотеки, например, юзер-интерфейс для фидбэков, поддержку е-мейла и другие.
Лицензия: Бесплатная программа.
4. BugshotKit
BugshotKit – встраиваемый в iOS-приложение инструмент баг-репортинга с возможностью комментировать скриншоты экранов и консолью логов. Предназначен только для мобильных разработчиков и тестировщиков.
Требования:
Характеристики:
- Активируется с помощью одного из жестов, выбранного заранее. Как только обнаруживается баг, то можно одним движением открыть отчётное окно и создать скриншот с NSLog() консолью в реальном времени.
Лицензия: Бесплатная программа с возможностью финансово поддержать на добровольной основе один из проектов автора.
Инструменты краш-репортинга
Если разработчик использует для своего мобильного приложения хорошую систему баг-репортинга, то в большинстве случаев она уже включает в себя функцию уведомлений о сбоях. Но не все мобильные проекты задействуют такие системы.
Когда приложение запущено в продакшн без системы баг-репортинга, остаётся, как минимум, ещё один острый вопрос: что будет, если приложение упадёт в процессе использования? Разработчику важно как можно скорее узнавать о крашах и уметь быстро реагировать на них, чтобы оперативно выпускать обновления.
Всё это выглядит очень наивно, потому что в 99% случаев пользователь просто проигнорирует запрос и не будет тратить время на подробный отчёт о случившемся сбое. В этой ситуации разработчику ничего не остаётся, кроме как заранее предусмотреть такое развитие событий и использовать специальные инструменты краш-репортинга. При этом фиксируются только краши, не баги.
Мы выделили два наиболее популярных сегодня инструмента для автоматического формирования краш-репортов:
1. Crashlytics
Crashlytics – инструмент краш-репортинга для iOS и Android, предоставляющий подробные отчёты о происходящих сбоях в приложении и о возможных угрозах.
Требования:
- Доступен для всех устройств и версий мобильных платформ
Характеристики:
- Позволяет отслеживать стек, который привёл к сбою
- Выполняет глубокий анализ приложения в разных направлениях и расставляет приоритеты по наиболее интересным строкам кода на предмет возможных угроз
- Осуществляет поиск по всем кастомизированным данным
- Отслеживает состояние девайсов, на которых запускается приложение
- Предназначен и для iOS, и для Android. Может оценивать системные ошибки, которые способны привести к крашам. Например, как влияет версия мобильной платформы на возникновение сбоев
- Приложение может быть установлено на рабочем столе разработчика со всей аналитикой и данными
Лицензия: Бесплатная программа.
2. ACRA (Automated Crash Reporting for Android)
ACRA – библиотека, которая позволяет Android приложению автоматически размещать в форме Google Doc отчеты о случающихся сбоях в работе.
Требования:
Характеристики:
- Позволяет разработчикам приложения получить все данные и логи происходящих сбоев, не задействовав пользователей
- Настраиваемое взаимодействие с пользователем. Можно выбрать, как сообщить пользователю приложения о краше – по умолчанию, в виде Android отчёта, или альтернативными способами в виде диалога с пользователем и другими
- Создаёт детализированный отчёт о случившимся сбое
- Допускает добавление переменных или отслеженных багов в отчёт вручную
- Позволяет отправлять отчёт об ошибках, даже если сбой еще не произошёл
- Отчёты могут храниться в оффлайн-режиме и отправляются, когда пользователь выходит в сеть и перезапускает приложение
- Может быть использовано с уникальным скриптом, прописанным разработчиком приложения
Лицензия: Бесплатная программа.
В начале статьи мы упоминали о том, как выглядит процесс заведения бага вручную. Он включает в себя несколько шагов, которые хотя и кажутся относительно простыми, на деле съедают массу времени. Особенно меня поймёт каждый из разработчиков, кто хоть раз в жизни слышал: «Дружище, все тестеры заняты. Заведи баг». Репортинг багов не так легко и быстро реализовать, как представляется на первый взгляд.
Возможно, некоторые из вас скажут, что дело за малым – оптимально распределить ресурсы, чтобы отслеживать проблемные места и оперативно информировать о багах. Но занятость команды проекта не всегда позволяет это сделать. Тогда самое разумное решение – подключить автоматизированные системы баг-репортинга, которые упрощают тестирование мобильных приложений. Главное, при выборе определенной программы или библиотеки обратите внимание, насколько она соответствует вашим ожиданиям и возможностям.
Подпишитесь
Оставьте адрес, и каждый месяц мы будем высылать свежую статью
о новых трендах в разработке програмного обеспечения.
Кроме того, если вы используете отчеты о тестировании для выявления проблем в приложении, то сбои, обнаруженные во время тестирования, указываются вместе со сбоями и ошибками ANR приложения. Однако поскольку сбои, обнаруженные при создании отчета о тестировании, поступают с тестирующих устройств, они не влияют на статистику сбоев.
Поиск информации
- Откройте Play Console.
- Выберите приложение.
- В меню слева выберите пункт Качество > Android Vitals > Сбои и ошибки ANR.
- Используйте фильтры в центре экрана для поиска и изучения неполадок. Чтобы получить дополнительную информацию об определенном сбое или ошибке ANR, выберите кластер.
Примечание. Когда вы выберете кластер, будет показан отдельный раздел, если при создании отчета о тестировании была обнаружена проблема. Раздел будет содержать информацию об устройстве, подробную информацию о сбое, данные Logcat с устройства и видео с ошибкой. Это поможет вам устранить неполадку.
По сбоям доступны сведения за предыдущие два месяца. О том, как пользователи Android разрешают передавать данные в Google, рассказывается в Справочном центре Аккаунтов.
Если в вашем приложении часто возникают сбои, найдите решение этой проблемы на сайте для разработчиков Android.
Ошибки ANR ("Приложение не отвечает")
Когда приложение не отвечает, открывается диалоговое окно, предлагающее пользователю подождать или закрыть приложение. Такие проблемы называются ошибками ANR. Сведения о них можно найти только в Play Console.
Сведения об ошибках ANR собираются с устройств Android, пользователи которых разрешили автоматически отправлять данные для диагностики. Доступна информация за предыдущие два месяца. О том, как пользователи Android разрешают передавать данные в Google, рассказывается в Справочном центре Аккаунтов.
Если в вашем приложении часто возникают ошибки ANR, найдите решение этой проблемы на сайте для разработчиков Android.
Пока закрытые от постороннего глаза страницы ВКонтакте не поддаются взлому, а сгорающим от любопытства детективам приходится создавать фейковые аккаунты и изобретать новые способы слежки, мы собрали для тебя несколько специальных приложений и хаков, которые помогут приоткрыть завесу тайны над твоей (и не только) страницей в соцсетях.
Агент 307 для ВКонтакте
Приложение на платформе Android с огромным количеством полезных функций: в «Агент 307» ты можешь узнать, кто из друзей и как часто посещает твою страницу, посмотреть, кому ставит лайки краш, проанализировать свои диалоги и найти аккаунты людей, живущих поблизости.
При этом расширение работает как полноценная соцсеть: «Агент» официально одобрен администрацией ВКонтакте, гарантирует безопасность твоих личных данных и, как приятный бонус, в нем сохранены практически все функции оригинального приложения.
Followers Plus для Инстаграма
Небольшая, но удобная программа, в которой ты можешь узнать имена тех, кто отписался от тебя или, наоборот, обнаружить частых посетителей страницы. Приложение позволяет проанализировать статистику гостей и поклонников, найти заблокировавших тебя пользователей и тоже добавить их в черный список.
И хотя расширение бесплатное, все возможные функции станут доступны только после покупки премиум-версии.
Панда — Шпион для соцсетей
Удобное приложение на платформе iOS, которое позволяет узнать имена тех, кто интересуется твоим профилем ВКонтакте, а также страницами в Инстаграме, Твиттере и Фейсбуке. Благодаря программе ты можешь узнать подробную информацию о статистике посещений и активности пользователей на твоих аккаунтах.
Приложение пока не доступно на платформе Android.
Мои гости для ВКонтакте
Чтобы воспользоваться всеми функциями этого расширения, необходимо зайти в раздел «Игры» ВКонтакте и найти там приложение «Мои гости». Только после этого ты сможешь узнать больше о своих поклонниках: статистику людей, которые лайкали, делились публикациями, комментировали записи и проявляли высокую активность на твоей странице.
Приложение удобно своей компактностью, наличием большого количества полезных функций и дополнительной статистики профилей твоих друзей.
«Мои гости» не требует дополнительных покупок и доступно на любой платформе.
Kate Mobile для ВКонтакте
Программа абсолютно бесплатная и не требует дополнительных денежных трат, но, к сожалению, доступна только на платформе Android.
Надеемся, ты воспользуешься нашими хаками с умом и только во благо: для удовлетворения своего любопытства, ведь активный сталкеринг в соцсетях никогда не доводил ни до чего хорошего! Поверь, твоя страница не влияет на то, какой ты человек. А если тебе интересен какой-то парень, гораздо лучше собраться с силами и пригласить объект симпатии на свидание (или хотя бы начать с ним разговор), чем жить в призрачном мире в надежде, что когда-нибудь он тебя заметит.
Материалы по теме
Общайся и следи за новостями ;)
Читай любимый журнал в электронном формате
Журнал Elle Girl
Подпишись на печатную версию журнала
© 2021 ELLEGirl, Hearst Shkulev Publishing / OOO «Хёрст Шкулёв Паблишинг». Все права защищены.
Читайте также: