Забудьте про терминал! Как я избавлялся от рутинных ADB команды с помощью Shortcuts

от автора

Всем привет! Я Арман, Senior Android QA, пишу про тестирование у себя на канале и здесь, на Хабре.

До этого года я спокойно пользовался терминалом для установки приложений на тестовые устройства android: каждый раз вручную копировал название файла, выбирал нужную команду из истории терминала, стирал старое название и вставлял новое. Это меня очень раздражало, но я не искал решений. А ведь кроме установки, есть множество других команд ADB, которые приходится использовать время от времени. Например, выгрузка последних логов из logcat на компьютер, для чего тоже нужно было прописывать путь для сохранения файла — очень неудобно и отнимает драгоценное время.

Так продолжалось, пока коллега не принесла автоматизированный сценарий в Automator на Mac. Классная вещь, которая позволяет создавать автоматизированные процессы без глубоких знаний программирования. Однако, с пачкой минусов, из-за которых, я в итоге оставил только идею и переписал всё на Shortcuts.

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

Чем не устроил Automator

На первый взгляд сценарий выглядел круто: автоматическая установка приложения на девайс в один клик. Но, как это часто бывает, у него были свои недостатки: отсутствовали уведомления о начале и завершении установки, не было возможности выбрать конкретное устройство, если их несколько, и не было проверок. Также не было возможности настроить горячие клавиши для этого процесса. Я решил доработать скрипт под свои нужды и в итоге почти всё переделал, перенеся его в Shortcuts (или «Команды»), оставив лишь идею.

Automator — хоть и мощный инструмент, но всё же ограничен в возможностях. К тому же, похоже, Apple больше его не поддерживает. Пришлось бы писать значительную часть логики вручную, а мне хотелось чего-то проще и быстрее. Конечно, у Automator есть плюс: готовый сценарий можно легко переслать в виде файла. Но для меня это не такая большая проблема, ведь в Shortcuts можно просто поделиться ссылкой. Так что я решил оставить Automator в стороне и найти более удобное решение, которое подошло бы как мне, так и вам.

О чём статья и для кого она

Это не будет инструкция по использованию Shortcuts на Mac. Я просто хочу показать, как легко можно упростить себе жизнь и создать многофункциональный инструмент без глубоких знаний программирования. Статья даст готовое решение для автоматизации работы с командами ADB, которым я поделюсь в конце. Но главное — это идея, которую вы сможете адаптировать к своим ежедневным процессам. Я покажу подход, позволяющий быстро масштабировать решение, добавляя свои команды без копипаста.

Если вы работаете на Windows, у вас тоже есть альтернатива Automator и Shortcuts — Power Automate. Это похожее решение, так что, если кто-то вдохновится сделать что-то подобное на Windows, будет здорово!

Конечно, всё это можно было бы закодить, но я не рассматривал этот вариант, так как не хотел вникать в особенности программирования на Mac, скачивать очередную IDE, изучать новый язык и всё в этом духе. Мне нужно было быстро и просто создать что-то работающее, чтобы в два клика ускорить работу и кайфовать.

Постановка проблемы и определение что нужно

Больше всего времени у меня уходило на установку приложений на телефон, так как приходилось вручную копировать имя файла и вставлять его в терминал. Если нужно было установить несколько файлов (у нас есть несколько приложений, которые работают вместе, и все их нужно тестировать совместно), объём работы удваивался, и ко всему добавлялось ожидание завершения первой команды, чтобы запустить следующую.

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

А если к компьютеру было подключено несколько устройств, нужно было выдёргивать кабели или использовать команду adb devices, чтобы выяснить, какое из них нужное. Это всё усложняло процесс.

Что я имел:

  • Несколько ADB-команд.

  • Желание запускать их автоматически, просто выбрав файлы (сначала выбор, потом запуск команды, чтобы не приходилось искать файл заново в Finder).

  • Возможность устанавливать несколько файлов одновременно.

  • Возможность выбирать, на каких устройствах выполнить команду.

  • Стремление минимизировать дублирования, чтобы не пришлось каждый раз вносить одни и те же изменения в разные команды.

  • Уведомления о выполнении операций, но только если это необходимо.

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

Основной модуль — исполнитель команд

Запустил я редактор быстрых команд (можно открыть набрав в поиске Команды или Shortcuts), нажал + и первым делом задал иконки и понятное название — наш исполнитель команд ADB будет называться execute_adb.

Что должна делать эта команда?

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

  • Определить количество подключённых устройств.

  • Выбрать, на каких устройствах запускать команды.

  • В цикле для каждого устройства последовательно выполнить команды из списка.

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

В целом это всё, приступаем к “кодингу”. 

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

Тут мы определяем adb команды и название быстрой команды, куда будет передан результат. Получаем количество объектов, в команды записываем все кроме последнего. Последнее соответственно присваиваем переменной для уведомлений. Я определяю для каждого “Получить” переменную просто для удобства далее, в целом можно работать сразу с этими “Объект из списка”, если получиться не запутаться.

Далее, нужно определить количество устройств, подключённых к ADB. Для этого выполняется команда adb devices, которая возвращает список. Чтобы сделать выбор удобнее, я использую расширенную команду adb devices -l, которая выводит дополнительную информацию, в том числе и человеческое имя / модель устройства. Запуск команды происходит через shell-скрипт.

На выходе мы получаем текстовый список устройств, который нужно распарсить, отделить серийные номера от имён устройств и вернуть всё списком. Для этого я выбрал AppleScript (не спрашивайте почему его, просто так). Я не собирался глубоко изучать этот язык, поэтому возложил эту задачу на ChatGPT. После нескольких попыток и корректировок удалось получить рабочий код. Этот скрипт берёт строки с устройствами и в цикле заполняет переменную в формате “serial_number device_name”.

on run {input, parameters} set devices to item 1 of input set textLines to paragraphs of devices set outputLines to {}  -- Перебор строк repeat with aLine in textLines -- Проверка, что строка содержит информацию об устройстве if aLine contains "device" and aLine does not contain "List of devices attached" then -- Поиск позиции "device" set devicePos to offset of "device" in aLine -- Извлечение идентификатора устройства set deviceID to text 1 thru (devicePos - 1) of aLine -- Удаление пробелов с конца идентификатора устройства repeat while deviceID ends with " " set deviceID to text 1 thru -2 of deviceID end repeat set modelStart to offset of "model:" in aLine set modelEnd to offset of " device:" in aLine if modelStart ≠ 0 and modelEnd ≠ 0 then set modelInfo to text (modelStart + 6) thru (modelEnd - 1) of aLine -- Добавление результата в итоговый список set end of outputLines to (deviceID & " " & modelInfo) end if end if end repeat return outputLines end run

Полученный результат разбивается на строки. Если устройств нет, выводится предупреждение с просьбой проверить подключение. Если всё в порядке и устройств несколько, выводится окно выбора устройства. Команда «Выбрать» удобно показывает пользователю окно с чекбоксами. Если устройство одно то окно выбора не будет показано.

Далее создаём два цикла: один по устройствам, другой по командам. В первом цикле разбиваем строку устройства на серийный номер (для ADB) и название устройства (для уведомлений). Далее для каждого устройства последовательно выполняются команды из списка.

Собираем и выполняем команду. При ошибках в shell-скрипте выполнение команды обычно прерывается, но я решил проблему, используя 2>&1 для перенаправления ошибок в вывод и true в конце, чтобы команда продолжала выполняться, передавая результат дальше.

Затем формируется список из модели устройства, результата выполнения и самой команды, и всё это передаётся в быструю команду для показа уведомлений или дальнейшей, если она была указана.

Пишем команды для execute_adb

Тадам — мы великолепны! Самое сложное сделано, осталось теперь просто написать генераторы команд и уведомлений.

Для примера, приведу моего злейшего врага — команду установки приложения. Нажимаем на + и создаём новую быструю команду.

Первое и главное что надо сделать – это правильно её настроить. Чего мы хотим?

Выделить несколько файлов, нажать пару кнопок, и чтобы всё само установилось.

Для этого идём в боковом меню в информацию о быстрой команде и включаем для нее две вещи: Finder – чтобы при нажатичтобы команда была доступна в разделе быстрых действий при нажатии ПКМ на файле и Службы – чтобы ниже определить сочетание клавиш, что позволит просто выделить файлы и нажать их для выполнения команды.

Теперь можно писать команду. Вернее команды, так как для каждого файла будет создаваться своя команда. Я использую команду install с флагами -r и -d, чтобы автоматически перезаписывать и делать даунгрейд, но будьте осторожны: даунгрейд работает только для debug-сборок и может вызвать проблемы. Если вы не уверены, лучше убрать этот флаг. Чтобы не передавать лишние файлы в ADB, предварительно проверяем расширения.

Обратите также внимание, что в теле команд не нужно писать ключевое слово adb, так как оно определяется уже в execute_adb вместе с устройством, на котором будет выполняться.

Команды записываются в одну переменную с помощью “Добавить в переменную”, затем передаются как элементы списка. После списка команд указываем название быстрой команды для обработки ответа от ADB и вызываем execute_adb, передавая в неё список.

Генератор уведомлений (install_notif)

Выше в генераторе команд мы уже дали ему название – install_notif, нужно его и вписать в поле названия. Далее получаем входные значения в порядке как они были заданы в execute_adb и определяем им переменные (опять же просто для удобства).

Если result пустое, то ничего не показываем. Проверяем успешность установки, опираясь на ключевые слова в ответе команды. Я хотел, чтобы при успешной установке выводилось уведомление с названием файла и устройства. Однако, так как команда install выводит текст «Performing Streamed Install», то не получиться просто проверить на Success, поэтому я решил проверять всё тело ответа для большей надёжности.

Обратите внимание что в теле “Отправить сообщение” в конце есть перевод на новую строку, иначе проверка не сработает. 

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

Ура! Инструмент готов! Видео как он работает вы видели в начале статьи, кроме меню из правой кнопки можно будет также выделить файлы и нажать заданное сочетание клавиш. Ниже поделюсь с вами ссылками на эти команды, а также дополнительно – отправку файла на устройство и выгрузку логов за выбранное время на компьютер. Примечание сочетание клавиш нужно будет ставить самим при шаринге они не сохраняются:

Спасибо всем, кто дочитал до конца! Если эта штука оказалась для вас полезной и вы вдохновились создать свои быстрые команды (для этой или других задач), буду рад, если поделитесь своими решениями. Заглядывайте ко мне на канал, я думаю дописать ещё полезных команд и автоматизаций и поделиться. Ну и в целом там у меня много полезного, в основном про тестирование, но заходите — будет интересно!


ссылка на оригинал статьи https://habr.com/ru/articles/852114/