Ошибки в Android приложениях - неотъемлемая часть любой разработки, то насколько быстро разработчик находит баг влияет на скорость создания мобильного приложения, а то, насколько точно получается локализовать проблему - на качество конечного продукта. Давайте рассмотрим подходы и инструменты, которые помогают при дебаге.
ADB = Android Debug Bridge
Все общение с подключенным устройством или эмулятором происходит через утилиту командной строки ADB (Android Debug Bridge) - данный инструмент входит в Android SDK и скачать его можно на официальной странице.
Debugger в Android Studio
Посмотреть как программа себя ведет по шагам, какие значения принимают переменные и т.д. позволяет debugger, встроенный в среду разработки Android Studio.
Breakpoint
Breakpoint, или по-русски "Точка останова" - флаг, устанавливающийся на определенную строчку-инструкцию в программе, которая говорит, что в этом месте исполнение приложения надо поставить на паузу и разработчик сможет посмотреть значения переменных в данный момент и решить - пойти ли дальше по шагам, зайти ли внутрь очередной функции или просто возобновить исполнение.
Для того, чтобы установить Breakpoint достаточно нажать на область рядом с номером строки
Чтобы запустить программу в debug режиме, есть специальная кнопка в панели Android studio
Также можно подключиться к уже выполняющемуся процессу
Когда процесс остановится в указанной точке можно перейти к следующей инструкции (строчке в программе), либо зайти внутрь функции, если в данный момент времени находимся на строчке вызова функции
Вычисление значений на лету
В режиме дебага, находясь на определенной строке можно посмотреть состояние программы в данный момент - какие переменные какие значения принимают
Также можно произвести любые вычисления в данном контексте
Подмена значений переменных на лету
Иногда полезно подменить значение переменной прямо на лету, например, когда отображение в интерфейсе зависит от переменной - удобно не перекомпилируя приложение или изменяя значения в базе данных посмотреть как будет выглядеть UI при разных значениях, это можно сделать прямо из окна мониторинга переменных
Условный Breakpoint
Не всегда необходимо всегда останавливать выполнение программы на определенной строке, к примеру, если хотим продебажить тело цикла, в котором много итераций и нам интересна только та, на которой выполняется определенное условие. Для таких целей точке останова можно задать условие:
программа остановится, только если выполнится условие для данного Breakpoint.
Layout inspector в Android Studio
В Android Studio есть одна очень полезная вещь - Layout inspector, он позволяет просмотреть UI открытой активности к разрезе отдельных View. Это бывает удобно, особенно если
- Необходимо отдебажить код, связанный с определенным интерфейсом - можно быстро найти нужные id view и перейти в IDE в нужный участок кода,
- Проблема связана с отображением интерфейса - можно посмотреть где какие элементы располагаются, что мешают друг другу и тд.
Layout inspector вызывается из меню Tools -> Layout inspector
Инструмент позволяет прямо в Android studio видеть элементы интерфейса запущенного Android приложения, посмотреть свойства отдельно взятого View и увидеть целиком иерархию конкретно взятого интерфейса
Логи как средство для дебага
Когда дело касается порядка вызова методов, особенно когда методы асинхронные, бегать по коду в режиме дебага не удобно. На помощь приходят логи и android logcat, инструмент, позволяющий получить логи из android приложения.
Разместив вывод в лог в интересующих методах можно наблюдать порядок их вызова.
Hint: для удобства и ускорения работы с логами, можно использовать Live template в Android Studio
Мой шаблон для расстановки логов с именем logs выглядит так
Log.e("!@#", "$package$.$method$:$line$");
Вывод в канал ошибок лога с тэгом !@#, что позволяет легко его отфильтровать и сообщением, которое содержит имя пакета, класс и строку.
Находясь на нужной строчке остается нажать Ctrl + J (вызов диалога добавления шаблона), написать logs и нажать Enter
И 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/