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-соединений.
К примеру:
Emulator 1, console: 5554 Emulator 1, adb: 5555 Emulator 2, console: 5556 Emulator 2, adb: 5557
Как только сервер установил соединения со всеми эмуляторами, можно использовать adb-команды для контроля и доступа к каждому из этих эмуляторов. Поскольку сервер управляет соединениями со всеми эмуляторами/устройствами и обрабатывает команды от нескольких adb-клиентов, можно управлять любым эмулятором/устройством из любого клиента (или скрипта).
Далее будут описаны команды adb, которые можно использовать для доступа и управления эмулятором/устройством. Обратим внимание на то, что при разработке Android приложений в среде Eclipse с установленным плагином ADT не нужен доступ к adb из командной строки. Плагин ADT обеспечивает прозрачную интеграцию adb в Eclipse. Однако можно использовать adb напрямую, например для отладки.
Использование команд adb
Команды adb можно вызывать непосредственно из командной строки на машине разработчика или из скрипта.
Использование:
adb [-d|-e|-s <serialNumber>] <command>
При вызове команды, программа обращается к adb-клиенту. Клиент специально не связан с каким-то одним эмулятором, поэтому если запущено много эмуляторов/устройств, нужно использовать параметр -s, чтобы указать эмулятор/устройство для обработки вызываемой команды (описание использования параметра -s).
Запрос к эмуляторам/устройствам
Перед вызовом команд adb неплохо было бы знать какие эмуляторы/устройства соединены с adb-сервером. Получить список подключенных эмуляторов/устройств можно вызвав команду devices:
adb devices
В ответ adb выдаст информацию о состоянии каждого эмулятора/устройства:
$ adb devices List of devices attached emulator-5554 device emulator-5556 device emulator-5558 device
Если нет запущенных эмуляторов/устройств, adb вернет: no device.
Формат выдачи списка([Серийный номер][Состояние]):
- Серийный номер – строка сгенерированная adb для уникальной идентификации эмулятора/устройства с номером порта консоли. Формат серийного номера
<тип>-<ПортКонсоли>. - Состояние – состояние соединения с эмулятором/устройством. Поддерживаются 2 состояния:
offline– эмулятор/устройство не соединено или не отвечает.device– эмулятор/устройство соединено с adb-сервером. Стоит отметить, что это состояние не означает, что система Android загружена и работает (например эмулятор/устройство подключается к adb еще во время загрузки системы). Однако после загрузки системы это состояние означает готовый к работе эмулятор/устройство.
Направление команд к указанным эмуляторам/устройствам
Если запущено несколько эмуляторов/устройств, нужно указать один из них для обработки команд adb. Для этого в команде нужно использовать параметр -s.
adb -s <serialNumber> <command>
Пример:
adb -s emulator-5554 install helloWorld.apk
Если выполнить команду без указания эмулятора/устройства с использованием параметра -s, adb выдаст ошибку.
Установка приложения
Можно использовать adb чтобы скопировать приложение с машины разработчика в эмулятор/устройство и установить его в системе Android. Для этого используется команда install. Вместе с этой командой указывается путь к файлу .apk, который нужно установить:
adb install <path_to_apk>
О том, как создать файл .apk, готовый к установке на эмуляторе/устройстве, читайте Android Asset Packaging Tool (aapt).
Если для разработки используется Eclipse IDE с установленным плагином ADT, нет необходимости использовать adb (или aapt) напрямую для установки разрабатываемого приложения на эмулятор/устройство. ADT плагин упакует и установит приложение сам.
Переадресация портов
Можно использовать команду forward, чтобы создать произвольную переадресацию портов (переадресацию запросов с одного порта на другой порт эмулятора/устройства). К примеру переадресация порта 6100 на порт 7100 эмулятора/устройства:
adb forward tcp:6100 tcp:7100
Также можно выполнять переадресацию на абстрактный UNIX сокет:
adb forward tcp:6100 local:logd
Копирование файлов на эмулятор/устройство или из него
Для копирования файлов на эмулятор/устройство используется команда push, для копирования из эмулятора/устройства используется команда pull. В отличие от команды install, которая копирует файл .apk в определенное место, эти команды (push и pull) позволяют копировать файлы и директории в любое (или из любого) место эмулятора/устройства.
Для копирования файла или директории (рекурсивно) из эмулятора/устройства:
adb pull <remote> <local>
Для копирования файла или директории (рекурсивно) на эмулятор/устройство:
adb push <local> <remote>
В командах <local> и <remote> указывают на путь к файлу/директории на машине разработчика(local) и эмуляторе/устройстве(remote).
Пример:
adb push foo.txt /sdcard/foo.txt
Список команд и параметров 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: adb forward tcp:8000 jdwp:472 jdb -attach localhost:8000 |
| Команды для работы с данными | |
install <path_to_apk> |
Помещает приложение Android (по указанному пути к .apk файлу) на эмулятор/устройство |
pull <remote> <local> |
Копирует файл из эмулятора/устройства на машину разработчика |
push <local> <remote> |
Копирует файл с машины разработчика на эмулятор/устройство |
| Команды для работы с портами и сетью | |
forward <local> <remote> |
Перенаправление соединения с локального порта на удаленный порт эмулятора/устройства
|
ppp <tty> [parm]... |
Запуск PPP через USB
|
| Команды для скриптов | |
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 используют так:
adb [-d|-e|-s {<serialNumber>}] shell <shellCommand>
Для входа в удаленный shell эмулятора/устройства, команду shell используют так:
adb [-d|-e|-s {<serialNumber>}] 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/.
Пример:
$ adb -s emulator-5554 shell # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db SQLite version 3.3.12 Enter ".help" for instructions .... enter commands, then quit... sqlite> .exit
Когда выполнена команда sqlite3 можно использовать команды sqlite3 в shell. Для выхода из sqlite3 и возврата в удаленный shell используют сочетание клавиш CTRL+D или команду exit.
Monkey стресс-тест интерфейса/приложения
Monkey – это программа, которая запускается на эмуляторе/устройстве и генерирует псевдо-случайные потоки пользовательских действий (таких как клики, прикосновения, жесты и вызовы ряда системных событий).
Простейший способ использования Monkey с помощью следующей команды, которая запускает приложение и отправляет 500 псевдо-случайных событий к нему.
$ adb shell monkey -v -p your.package.name 500
Более развернутую информацию о Monkey можно найти на странице UI/Application Exerciser Monkey.
Другие команды shell
В таблице ниже приведен список из нескольких команд, доступных в adb shell. Для получения полного списка команд adb, нужно запустить эмулятор и выполнить команду adb -help.
Для получения полного списка программ доступных в shell, нужно выполнить команду:
adb shell ls /system/bin
Для большинства команд в shell доступна помощь (параметр -help)
| Команда | Описание |
|---|---|
dumpsys |
Выводит дамп данных о системе на экран |
dumpstate |
Записывает состояние в файл |
logcat [<option>]... [<filter-spec>]... |
Включает лог и выводит на его экран |
dmesg |
Выводит на экран сообщения отладки ядра |
start |
Запускает (перезапускает) эмулятор/устройство |
stop |
Останавливает эмулятор/устройство |
Включение лога logcat
Система ведения лога в Android обеспечивает механизм для сбора и просмотра системных отладочных сообщений. Логи из различных приложений и элементов системы Android собираются в серии кольцевых буферов, которые затем можно просматривать и фильтровать посредством команды logcat.
Использование команды logcat
Logcat можно использовать для просмотра и слежения за содержанием буферов системного лога. Основное использование logcat:
[adb] logcat [<option>] ... [<filter-spec>] ...
Ниже описываются фильтры и параметры команды.
Команду logcat можно использовать с машины разработки
$ adb logcat
или из удаленного shell
# logcat
Фильтрация вывода лога
Каждое сообщение лога в Android имеет тэг и приоритет
- Тэг – это строка указывающая компонент системы, от которого принято сообщение (например: View для системы view)
- Приоритет – имеет одно из нижеследующих значений (в порядке от меньшего к большему):
V— Verbose (низший приоритет)D— DebugI— InfoW— WarningE— ErrorF— FatalS— Silent (наивысший приоритет, при котором ничего не выводится)
Получить список тэгов, используемых в системе, вместе с их приоритетами можно запустив logcat. В первых двух столбцах каждого из выведенных сообщений будут указаны <приоритет>/<тэг>.
Пример выводимого logcat сообщения:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
Для уменьшения вывода лога до приемлемого уровня нужно использовать выражения фильтра. Выражения фильтра позволяют указать системе нужные комбинации <тэг> и <приоритет>, остальные сообщения система не выводит.
Выражения фильтра имеют следующий формат <тэг>:<приоритет> ..., где <тэг> указывает нужный тэг, <приоритет> указывает минимальный уровень приоритета для выбранного тэга. Сообщения с выбранным тэгом и приоритетом на уровне или выше указанного записываются в лог. Можно использовать любое количество пар <тэг>:<приоритет> в одном выражении фильтра. Для разделения пар <тэг>:<приоритет> используется пробел.
Пример ниже выводит в лог все сообщения с тэгом “ActivityManager” с приоритетом “Info” или выше, и сообщения с тэгом “MyApp” и приоритетом “Debug” или выше:
adb logcat ActivityManager:I MyApp:D *:S
Последний элемент в выражении фильтра *:S устанавливает приоритет “silent” для всех остальных тэгов, тем самым обеспечивая вывод сообщений только для “View” и “MyApp”. Использование *:S – это отличный способ для вывода в лог только явно указанных фильтров (т.е. в выражении фильтра указывается “белый список” сообщений, а *:S отправляет все остальное в “черный список”).
При помощи следующего выражения фильтра отображаются все сообщения с приоритетом “warning” или выше для всех тэгов:
adb logcat *:W
Если logcat запускается на машине разработчика (не через удаленный adb shell), можно также установить значение выражения фильтра по умолчанию задав переменную окружения ANDROID_LOG_TAGS:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
Следует обратить внимание что задав переменную окружения ANDROID_LOG_TAGS она не будет работать в эмуляторе/устройстве, если вы будете использовать logcat в удаленном shell или используя adb shell logcat.
Вышеописанная команда export работает в ОС *nix и не работает в Windows.
Контроль формата вывода лога
Сообщения лога в дополнение к тэгу и приоритету содержат несколько полей метаданных. Можно изменять формат вывода сообщений показывая только конкретные поля метаданных. Для этого используется параметр -v и указывается один из ниже перечисленных форматов вывода.
brief— Показывать приоритет/тэг и PID процесса (формат по умолчанию).process— Показывать только PID.tag— Показывать только приоритет/тэг.thread— Показывать только процесс:поток и приоритет/тэг.raw— Показать необработанное сообщение, без полей метаданных.time— Показывать дату, время вызова, приоритет/тэг и PID процесса.long— Показывать все поля метаданных и отдельно сообщения с пустыми строками.
При запуске logcat можно указать формат вывода используя параметр -v:
[adb] logcat [-v <format>]
Пример, который показывает сообщения в формате thread:
adb logcat -v thread
Нужно отметить, что можно использовать только один формат с параметром -v.
Просмотр альтернативного буфера лога
Система логов Android держит несколько кольцевых буферов для лога сообщений и не все сообщения отправляются в основной буфер. Для отображения дополнительных сообщений лога нужно запустить logcat с параметром -b. Таким образом можно посмотреть один из альтернативных буферов:
radio— Просмотр буфера с сообщениями связанными с радио/телефоном.events— Просмотр буфера с сообщениями связанными с событиями.main— Просмотр основного буфера (по умолчанию).
Пример ниже показывает буфер с радио и телефонными сообщениями:
adb logcat -b radio
Просмотр stdout и stderr
По умолчанию система Android шлет вывод stdout и stderr (System.out и System.err) в /dev/null (удаляет). В процессах, которые выполняются в виртуальной машине Dalvik (Dalvik VM) может осуществляться запись копии вывода в лог файл. В этом случае система записывает сообщения в лог используя тэги stdout и stderr с приоритетом I.
Для перенаправления вывода нужно остановить эмулятор/устройство, затем выполнить команду shell setprop для включения перенаправления вывода. Пример того как это делается:
$ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start
Система сохраняет эту настройку, пока работает эмулятор/устройство. Чтобы использовать эту настройку по умолчанию в эмуляторе/устройстве, нужно добавить эту команду в /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.
Источник
Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
adb, консольные утилиты
Комментариев: 2
Gudman: 8 Октябрь 2011 в 17:00. #
Как запустить эмулятор с командой?
с “-partition-size 512″
kraY: 10 Октябрь 2011 в 19:42. #
Сначала AVD`шку создать
C:\android-sdk-windows\tools>android create avd -n xTest -t 1 -c 256M
А потом запустить
C:\android-sdk-windows\tools>emulator -avd xTest