Найти тему
Android разработка

Debug ошибок в андроид приложениях

Оглавление
Дебаг андроид приложений
Дебаг андроид приложений

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

ADB = Android Debug Bridge

Все общение с подключенным устройством или эмулятором происходит через утилиту командной строки ADB (Android Debug Bridge) - данный инструмент входит в Android SDK и скачать его можно на официальной странице.

Debugger в Android Studio

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

Breakpoint

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

Для того, чтобы установить Breakpoint достаточно нажать на область рядом с номером строки

-2

Чтобы запустить программу в debug режиме, есть специальная кнопка в панели Android studio

-3

Также можно подключиться к уже выполняющемуся процессу

-4

Когда процесс остановится в указанной точке можно перейти к следующей инструкции (строчке в программе), либо зайти внутрь функции, если в данный момент времени находимся на строчке вызова функции

-5

Вычисление значений на лету

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

-6

Также можно произвести любые вычисления в данном контексте

-7

Подмена значений переменных на лету

Иногда полезно подменить значение переменной прямо на лету, например, когда отображение в интерфейсе зависит от переменной - удобно не перекомпилируя приложение или изменяя значения в базе данных посмотреть как будет выглядеть UI при разных значениях, это можно сделать прямо из окна мониторинга переменных

-8

Условный Breakpoint

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

-9

программа остановится, только если выполнится условие для данного Breakpoint.

Layout inspector в Android Studio

В Android Studio есть одна очень полезная вещь - Layout inspector, он позволяет просмотреть UI открытой активности к разрезе отдельных View. Это бывает удобно, особенно если

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

Layout inspector вызывается из меню Tools -> Layout inspector

-10

Инструмент позволяет прямо в Android studio видеть элементы интерфейса запущенного Android приложения, посмотреть свойства отдельно взятого View и увидеть целиком иерархию конкретно взятого интерфейса

-11

Логи как средство для дебага

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

Разместив вывод в лог в интересующих методах можно наблюдать порядок их вызова.

Hint: для удобства и ускорения работы с логами, можно использовать Live template в Android Studio

Мой шаблон для расстановки логов с именем logs выглядит так

Log.e("!@#", "$package$.$method$:$line$");

Вывод в канал ошибок лога с тэгом !@#, что позволяет легко его отфильтровать и сообщением, которое содержит имя пакета, класс и строку.

Находясь на нужной строчке остается нажать Ctrl + J (вызов диалога добавления шаблона), написать logs и нажать Enter

-12

И IDE сама добавит строку, вида

Log.e("!@#", "com.package.test.MyActivity:64");

Сетевой мониторинг

Когда дело доходит до взаимодействия с сервером, не всегда ошибка на стороне клиента. В процессе разработки всегда стоит включать логирование сетевый запросов и ответов в Logcat.

Okhttp

Okhttp - популярный HTTP клиент, который позволяет включить логирование сетевых запросов практически из коробки.

Добавляем в проект библиотеку logging-interceptor

implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'

и при конфигурировании Okhttp клиента добавляем нужный interceptor, а для того, чтобы логи не попали в релизную версию наверняка, условием добавления логирования сетевых запросов можно определить как сборка Debug версии приложения

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
builder.addInterceptor(logging);
}
OkHttpClient client = builder.build();

Retrofit

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

builder.client(okHttpClient);

Fiddler, Charles и другие прокси

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

Остались вопросы по разработке и дебагу андроид приложений? Добро пожаловать в комментарии или пишите мне.

Оригинал статьи размещен здесь: https://dimlix.com/debug-android-apps/