DRY. Don’t Repeat Yourself. Принцип, призывающий разработчика не дублировать код. DRY часто можно распространить шире, не только на код. Сегодня расскажу о личном проекте, который уже помог мне и другим разработчикам избавиться от последовательности рутинных действий при разработке и отладке приложений для Android. И не просто расскажу — а ещё и поделюсь этим инструментом и его исходным кодом.

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

Если при работе над приложением вы хотите уменьшить количество таких действий и переключений фокуса с IDE на Android-устройство, то прошу под кат.

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

  • переключиться на регион A (профиль > регион > набрать название города);
  • добавить в корзину товар X (поиск > набрать название товара > в корзину);
  • переключиться на регион B (профиль > регион > набрать название города);
  • добавить в корзину товар Y (поиск > набрать название товара > в корзину);
  • перейти на экран корзины.

Около двадцати действий с приложением — и это без учёта ввода текста. Чтобы автоматизировать сценарий, я решил использовать диплинки.

Напомню, что диплинк — это специальным образом сформированный URI. Чтобы приложение его поддерживало, нужно зарегистрировать схему URI в манифесте приложения и реализовать логику обработки. Более подробная документация тут. Как правило, диплинки используются, чтобы открывать приложение на определённом экране после клика на сайте или в рассылке. Для тестирования диплинков в Android можно имитировать переход по диплинку через ADB-команду.

На тот момент в нашем приложении уже поддерживался ряд диплинков, но покрывали они только часть необходимой мне функциональности. Поэтому для описанного выше сценария создали два новых диплинка: переключение региона и добавление товара в корзину. Такие диплинки необходимы только для отладки и тестирования, поэтому мы называем их отладочными, они недоступны пользователям в релизной сборке. Логика обработки стандартных диплинков — это действия, связанные с навигацией внутри приложения. Отладочные диплинки, как правило, оперируют с логикой, не связанной с UI.

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

Чем плагин лучше приложения:

  • нет необходимости тянуть за собой ADB или искать его в системе: в IDE есть API для работы с ADB;
  • не нужно переключаться между окном IDE и приложения;
  • плагин, в отличие от приложений, легко распространять (у каждой ОС свой источник доверенного ПО).

В итоге за несколько вечеров родилась первая версия плагина Deeplink Helper, позволяющая отправлять диплинки на устройство. Диплинки при этом могут быть с аргументом или без. Им можно задавать читабельное название. После выполнения каждая команда попадает в лог, он же сценарий. Можно сохранить его, открыть в другой IDE, поделиться им с командой. При этом команды из сценария можно выполнять как по одной, так и все подряд.

image

Таким образом получается автоматизировать целые сценарии. Я редко пользуюсь выполнением сценариев полностью, за раз. Как правило, удобнее поочерёдно выполнять команды. Сценариями особенно трудновоспроизводимых случаев можно делиться с тестировщиками. Экономим их время.

В какой-то момент возникла потребность добавить в плагин возможность выполнения произвольных ADB-команд. И это было сделано. И конечно же, помимо диплинков, можно добавлять произвольные ADB/shell-команды. Задаётся это всё в едином конфигурационном файле формата JSON, в котором следует указать packageName приложения. Также доступно редактирование конфигурации, туда можно добавить и свои диплинки, и полезные ADB-команды (примеры тут).

Я чаще всего использую такие сценарии, состоящие только из ADB-команд:

  • переподключить устройство к Charles: (ADB reverse, выключить Wi-Fi, включить Wi-Fi);
  • очистить данные приложения;
  • открыть приложение.

Эти команды уже есть в конфигурационном файле по умолчанию.

Плагин продолжает разрабатываться. Например, пока нельзя выбрать из нескольких подключённых устройств, обрабатываются диплинки не более чем с одним аргументом. Если вам интересно присоединиться к доработке Deeplink Helper, присылайте пул-реквесты на гитхабе. Сам плагин можно скачать тут.

Надеюсь, этот простой инструмент сэкономит время и вам. Уверен, существуют альтернативные варианты решения этой проблемы — буду рад обсудить их в комментариях.