Android Debug Bridge (adb)


Android Debug Bridge (adb) – это универсальный инструмент, позволяющий управлять эмуляторами устройств и самими устройствами на базе Android. ADB – клиент-серверное приложение состоящее из 3х компонентов:
Клиент – запускается на машине разработчика. Клиент можно запустить из командной строки при помощи команд посылаемых adb. Другие инструменты Android вроде плагина ADT и DDMS тоже создают adb-клиенты.
Сервер – запускается на машине разработчика в виде фонового процесса. Сервер управляет соединениями между клиентами и adb-сервисом запущенным на эмуляторе или устройстве.
Сервис – фоновый процесс, который запускается на каждом эмуляторе или устройстве.
Инструмент adb можно найти в директории <sdk>/platform-tools/.

Клиент при запуске сначала проверяет запущен ли adb-сервер. Если сервер не запущен, то клиент запускает его. Сервер при старте привязывается к 5037 TCP порту и слушает команды, посылаемые adb-клиентами. Все adb-клиенты используют 5037 порт для связи с adb-сервером.

Затем сервер устанавливает соединения со всеми работающими эмуляторами/устройствами. Сервер находит их путем сканирования нечетных портов в диапазоне 5555-5585. Если сервер находит adb-сервис на одном из этих портов, то устанавливает соединение с найденным портом. Обратим внимание на то, что каждый эмулятор/устройство использует пару, следующих друг за другом, портов: четный порт – для соединения с консолью, нечетный порт – для adb-соединений.
К примеру:

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

Далее будут описаны команды adb, которые можно использовать для доступа и управления эмулятором/устройством. Обратим внимание на то, что при разработке Android приложений в среде Eclipse с установленным плагином ADT не нужен доступ к adb из командной строки. Плагин ADT обеспечивает прозрачную интеграцию adb в Eclipse. Однако можно использовать adb напрямую, например для отладки.

Использование команд adb

Команды adb можно вызывать непосредственно из командной строки на машине разработчика или из скрипта.
Использование:

При вызове команды, программа обращается к adb-клиенту. Клиент специально не связан с каким-то одним эмулятором, поэтому если запущено много эмуляторов/устройств, нужно использовать параметр -s, чтобы указать эмулятор/устройство для обработки вызываемой команды (описание использования параметра -s).

Запрос к эмуляторам/устройствам

Перед вызовом команд adb неплохо было бы знать какие эмуляторы/устройства соединены с adb-сервером. Получить список подключенных эмуляторов/устройств можно вызвав команду devices:

В ответ adb выдаст информацию о состоянии каждого эмулятора/устройства:

Если нет запущенных эмуляторов/устройств, adb вернет: no device.
Формат выдачи списка([Серийный номер][Состояние]):

  • Серийный номер – строка сгенерированная adb для уникальной идентификации эмулятора/устройства с номером порта консоли. Формат серийного номера <тип>-<ПортКонсоли>.
  • Состояние – состояние соединения с эмулятором/устройством. Поддерживаются 2 состояния:
    • offline – эмулятор/устройство не соединено или не отвечает.
    • device – эмулятор/устройство соединено с adb-сервером. Стоит отметить, что это состояние не означает, что система Android загружена и работает (например эмулятор/устройство подключается к adb еще во время загрузки системы). Однако после загрузки системы это состояние означает готовый к работе эмулятор/устройство.

Направление команд к указанным эмуляторам/устройствам

Если запущено несколько эмуляторов/устройств, нужно указать один из них для обработки команд adb. Для этого в команде нужно использовать параметр -s.

Пример:

Если выполнить команду без указания эмулятора/устройства с использованием параметра -s, adb выдаст ошибку.

Установка приложения

Можно использовать adb чтобы скопировать приложение с машины разработчика в эмулятор/устройство и установить его в системе Android. Для этого используется команда install. Вместе с этой командой указывается путь к файлу .apk, который нужно установить:

О том, как создать файл .apk, готовый к установке на эмуляторе/устройстве, читайте Android Asset Packaging Tool (aapt).

Если для разработки используется Eclipse IDE с установленным плагином ADT, нет необходимости использовать adb (или aapt) напрямую для установки разрабатываемого приложения на эмулятор/устройство. ADT плагин упакует и установит приложение сам.

Переадресация портов

Можно использовать команду forward, чтобы создать произвольную переадресацию портов (переадресацию запросов с одного порта на другой порт эмулятора/устройства). К примеру переадресация порта 6100 на порт 7100 эмулятора/устройства:

Также можно выполнять переадресацию на абстрактный UNIX сокет:

Копирование файлов на эмулятор/устройство или из него

Для копирования файлов на эмулятор/устройство используется команда push, для копирования из эмулятора/устройства используется команда pull. В отличие от команды install, которая копирует файл .apk в определенное место, эти команды (push и pull) позволяют копировать файлы и директории в любое (или из любого) место эмулятора/устройства.
Для копирования файла или директории (рекурсивно) из эмулятора/устройства:

Для копирования файла или директории (рекурсивно) на эмулятор/устройство:

В командах <local> и <remote> указывают на путь к файлу/директории на машине разработчика(local) и эмуляторе/устройстве(remote).
Пример:

Список команд и параметров adb

Команда Описание
Параметры
-d Направление команд adb только в устройства, подключенные через USB
-e Направление команд adb только в эмуляторы
-s <serialNumber> Направление команд adb указанному эмулятору/устройству с указанием <serialNumber>(такого как “emulator-5556″)
Основные команды
devices Выводит список подключенных эмуляторов/устройств на экран
help Выводит список команд, поддерживаемых adb на экран
version Выводит версию adb на экран
Команды отладки
logcat [<option>] [<filter-specs>] Выводит сообщения лога на экран
bugreport Выводит данные dumpsys, dumpstate и logcat на экран
jdwp Выводит список доступных процессов JDWP (Java Debug Wire Protocol) на данном устройстве.
Можно использовать переадресацию портов для подключения к конкретному процессу JDWP:
Команды для работы с данными
install <path_to_apk> Помещает приложение Android (по указанному пути к .apk файлу) на эмулятор/устройство
pull <remote> <local> Копирует файл из эмулятора/устройства на машину разработчика
push <local> <remote> Копирует файл с машины разработчика на эмулятор/устройство
Команды для работы с портами и сетью
forward <local> <remote> Перенаправление соединения с локального порта на удаленный порт эмулятора/устройства

  • tcp:<portnum>
  • local:<UNIX domain socket name>
  • dev:<character device name>
  • jdwp:<pid>
ppp <tty> [parm]... Запуск PPP через USB

  • <tty> — терминал PPP потока. Например dev:/dev/omap_csmi_ttyl.
  • [parm]... — список PPP/PPPD параметров, таких как defaultroute, local, notty и др.
Команды для скриптов
get-serialno Выводит серийный номер эмулятора/устройства
get-state Выводит состояние эмулятора/устройства
wait-for-device Блокирует выполнение, пока эмулятор/устройство не будет включено, т.е. пока его состояние не станет device
Команды для adb-сервера
start-server Проверяет, запущен ли adb-сервер и если нет, то запускает его
kill-server Останавливает adb-сервер
Команды для shell
shell Запуск удаленной командной оболочки (shell) на эмуляторе/устройстве
shell [<shellCommand>] Выполнение команды shell на эмуляторе/устройстве и выход из shell

Выполнение команд на эмуляторе/устройстве

Adb предоставляет командную оболочку (shell), которую можно использовать для выполнения различных команд на эмуляторе/устройстве. Исполняемые файлы команд находятся в системе эмулятора/устройства по следующему пути/system/bin/...
Можно использовать команду shell для выполнения команд, с или без входа в удаленный shell через adb.
Для выполнения одиночной команды без входа в удаленный shell, команду shell используют так:

Для входа в удаленный shell эмулятора/устройства, команду shell используют так:

Для завершения работы с удаленным shell используют сочетание клавиш CTRL+D или команду exit.

Ниже более подробна описана работа с командами shell, которые можно использовать.

Работа с sqlite3 базой данных через shell

Из adb удаленного shell можно использовать программу командной строки sqlite3 для управления базами данных SQLite, созданными приложениями Android. Инструмент sqlite3 включает в себя много полезных команд, таких как .dump (выводит содержимое таблицы) и .schema (выводит результат оператора SQL CREATE для существующей таблицы). Также этот инструмент дает возможность выполнять SQLite запросы.

Для использования sqlite3 нужно войти в удаленный shell, как описано выше, затем выполнить команду sqlite3. Дополнительно можно указать полный путь к базе данных которую нужно изучить. Эмулятор/устройство сохраняет базы данных SQLite3 в директории /data/data/<название_пакета>/databases/.
Пример:

Когда выполнена команда sqlite3 можно использовать команды sqlite3 в shell. Для выхода из sqlite3 и возврата в удаленный shell используют сочетание клавиш CTRL+D или команду exit.

Monkey стресс-тест интерфейса/приложения

Monkey – это программа, которая запускается на эмуляторе/устройстве и генерирует псевдо-случайные потоки пользовательских действий (таких как клики, прикосновения, жесты и вызовы ряда системных событий).
Простейший способ использования Monkey с помощью следующей команды, которая запускает приложение и отправляет 500 псевдо-случайных событий к нему.

Более развернутую информацию о Monkey можно найти на странице UI/Application Exerciser Monkey.

Другие команды shell

В таблице ниже приведен список из нескольких команд, доступных в adb shell. Для получения полного списка команд adb, нужно запустить эмулятор и выполнить команду adb -help.
Для получения полного списка программ доступных в shell, нужно выполнить команду:

Для большинства команд в shell доступна помощь (параметр -help)

Команда Описание
dumpsys Выводит дамп данных о системе на экран
dumpstate Записывает состояние в файл
logcat [<option>]... [<filter-spec>]... Включает лог и выводит на его экран
dmesg Выводит на экран сообщения отладки ядра
start Запускает (перезапускает) эмулятор/устройство
stop Останавливает эмулятор/устройство

Включение лога logcat

Система ведения лога в Android обеспечивает механизм для сбора и просмотра системных отладочных сообщений. Логи из различных приложений и элементов системы Android собираются в серии кольцевых буферов, которые затем можно просматривать и фильтровать посредством команды logcat.

Использование команды logcat

Logcat можно использовать для просмотра и слежения за содержанием буферов системного лога. Основное использование logcat:

Ниже описываются фильтры и параметры команды.
Команду logcat можно использовать с машины разработки

или из удаленного shell

Фильтрация вывода лога

Каждое сообщение лога в Android имеет тэг и приоритет

  • Тэг – это строка указывающая компонент системы, от которого принято сообщение (например: View для системы view)
  • Приоритет – имеет одно из нижеследующих значений (в порядке от меньшего к большему):
    • V — Verbose (низший приоритет)
    • D — Debug
    • I — Info
    • W — Warning
    • E — Error
    • F — Fatal
    • S — Silent (наивысший приоритет, при котором ничего не выводится)

Получить список тэгов, используемых в системе, вместе с их приоритетами можно запустив logcat. В первых двух столбцах каждого из выведенных сообщений будут указаны <приоритет>/<тэг>.
Пример выводимого logcat сообщения:

Для уменьшения вывода лога до приемлемого уровня нужно использовать выражения фильтра. Выражения фильтра позволяют указать системе нужные комбинации <тэг> и <приоритет>, остальные сообщения система не выводит.
Выражения фильтра имеют следующий формат <тэг>:<приоритет> ..., где <тэг> указывает нужный тэг, <приоритет>указывает минимальный уровень приоритета для выбранного тэга. Сообщения с выбранным тэгом и приоритетом на уровне или выше указанного записываются в лог. Можно использовать любое количество пар <тэг>:<приоритет> в одном выражении фильтра. Для разделения пар <тэг>:<приоритет> используется пробел.
Пример ниже выводит в лог все сообщения с тэгом “ActivityManager” с приоритетом “Info” или выше, и сообщения с тэгом “MyApp” и приоритетом “Debug” или выше:

Последний элемент в выражении фильтра *:S устанавливает приоритет “silent” для всех остальных тэгов, тем самым обеспечивая вывод сообщений только для “View” и “MyApp”. Использование *:S – это отличный способ для вывода в лог только явно указанных фильтров (т.е. в выражении фильтра указывается “белый список” сообщений, а *:S отправляет все остальное в “черный список”).
При помощи следующего выражения фильтра отображаются все сообщения с приоритетом “warning” или выше для всех тэгов:

Если logcat запускается на машине разработчика (не через удаленный adb shell), можно также установить значение выражения фильтра по умолчанию задав переменную окружения ANDROID_LOG_TAGS:

Следует обратить внимание что задав переменную окружения ANDROID_LOG_TAGS она не будет работать в эмуляторе/устройстве, если вы будете использовать logcat в удаленном shell или используя adb shell logcat.
Вышеописанная команда export работает в ОС *nix и не работает в Windows.

Контроль формата вывода лога

Сообщения лога в дополнение к тэгу и приоритету содержат несколько полей метаданных. Можно изменять формат вывода сообщений показывая только конкретные поля метаданных. Для этого используется параметр -v и указывается один из ниже перечисленных форматов вывода.

  • brief — Показывать приоритет/тэг и PID процесса (формат по умолчанию).
  • process — Показывать только PID.
  • tag — Показывать только приоритет/тэг.
  • thread — Показывать только процесс:поток и приоритет/тэг.
  • raw — Показать необработанное сообщение, без полей метаданных.
  • time — Показывать дату, время вызова, приоритет/тэг и PID процесса.
  • long — Показывать все поля метаданных и отдельно сообщения с пустыми строками.

При запуске logcat можно указать формат вывода используя параметр -v:

Пример, который показывает сообщения в формате thread:

Нужно отметить, что можно использовать только один формат с параметром -v.

Просмотр альтернативного буфера лога

Система логов Android держит несколько кольцевых буферов для лога сообщений и не все сообщения отправляются в основной буфер. Для отображения дополнительных сообщений лога нужно запустить logcat с параметром -b. Таким образом можно посмотреть один из альтернативных буферов:

  • radio — Просмотр буфера с сообщениями связанными с радио/телефоном.
  • events — Просмотр буфера с сообщениями связанными с событиями.
  • main — Просмотр основного буфера (по умолчанию).

Пример ниже показывает буфер с радио и телефонными сообщениями:

Просмотр stdout и stderr

По умолчанию система Android шлет вывод stdout и stderr (System.out и System.err) в /dev/null (удаляет). В процессах, которые выполняются в виртуальной машине Dalvik (Dalvik VM) может осуществляться запись копии вывода в лог файл. В этом случае система записывает сообщения в лог используя тэги stdout и stderr с приоритетом I.
Для перенаправления вывода нужно остановить эмулятор/устройство, затем выполнить команду shell setprop для включения перенаправления вывода. Пример того как это делается:

Система сохраняет эту настройку, пока работает эмулятор/устройство. Чтобы использовать эту настройку по умолчанию в эмуляторе/устройстве, нужно добавить эту команду в /data/local.prop в эмуляторе/устройстве.

Список параметров команды logcat

Параметр Описание
-b <buffer> Загрузить альтернативный буфер лога для просмотра, такой как event или radio. Основной буфер используется по умолчанию. Смотри Просмотр альтернативного буфера лога.
-c Очистить (сбросить) лог и выйти.
-d Вывести лог на экран и выйти.
-f <filename> Записать сообщения лога в файл <filename>. По умолчанию в stdout.
-g Вывести размер указанного буфера лога и выйти.
-n <count> Установить максимальное количество ротаций лога (количество хранимых сжатых фрагментов лога) <count>. По умолчанию 4. Требует параметр -r.
-r <kbytes> Выполнять ротацию каждые <kbytes> вывода (разделять лог на фрагменты по <kbytes>). По умолчанию 16. Требует параметр -f.
-s Устанавливает silent фильтром по умолчанию .
-v <format> Устанавливает формат вывода сообщений лога. По умолчанию brief. Полный список поддерживаемых форматов – Контроль формата вывода лога.

Остановка adb-сервера

В некоторых случаях бывает нужно завершить процесс adb-сервера, а потом перезапустить его. Например если adb не реагирует на команды, нужно завершить adb-сервер и перезапустить его.
Чтобы остановить adb-сервер, нужно использовать kill-server. Перезапустить сервер можно выполнив любую команду adb.

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *