Удаленная отладка приложений в ОС Android *
Android* Debug Bridge
Android Debug Bridge (ADB) — это программа командной строки, поддерживающая обмен данными между отладчиком на компьютере (обычно это GDB *, DDMS * (Dalvik * Debug Monitor Server) или ADT) и образом Android на целевом устройстве. Целевой образ может работать как на эмулируемом виртуальном устройстве, так и на физическом устройстве, обмен данными с которым осуществляется с помощью кабеля USB-OTG или адаптера USB-Ethernet. ADB является связующим элементом, дающим возможность отлаживать приложения Android.
Устройство, к которому выполняется подключение, может быть самых разных типов и размеров. Обычно это смартфон или планшет. Впрочем, это может быть и медицинский планшет, промышленное устройство, а также домашнее устройство для управления электроэнергией, складской терминал или любые другие аналогичные системы.
Настройка Android Debug Bridge для удаленной отладки приложений на платформе с процессором Intel® AtomTM практически не отличается от отладки другой архитектуры.
Прежде всего необходимо установить на компьютере Android SDK, в том числе ADB. Инструкции см. по адресу http://developer.android.com/sdk/installing.html.
Настройка ADB*
Если целевой образ запущен на физическом устройстве, то нужно включить поддержку USB-OTG или USB-Ethernet. Для поддержки USB-Ethernet требуется изменение конфигурации ядра и повторная сборка. OEM-поставщик предоставит необходимую информацию по этой процедуре.
Стандартный способ удаленной отладки приложений предусматривает использование интерфейса USB-OTG, которым оснащено большинство устройств с Android. Установка достаточно подробно описана на веб-сайте разработчиков Android *http://developer.android.com/guide/developing/device.html.
Вот основные действия:
1. Объявите для приложения свойство debuggable в манифесте Android.
При использовании Eclipse можно пропустить этот шаг, поскольку отладка автоматически включается при запуске приложения из среды разработки Eclipse.
В файле AndroidManifest.xml
добавьте android:debuggable="true"
в элемент <application>
.
Примечание:Если вручную включить отладку в файле манифеста, не забудьте отключить ее перед сборкой приложения для выпуска (опубликованное приложение, как правило, не должно иметь возможность отладки).
2. Включите на устройстве отладку через USB.
На устройстве откройте Settings > Applications > Developmentи установите флаг USB debugging (в версии Android 4.0 он находится в меню Settings > Developer options).
3. Настройте систему для обнаружения устройства.
o В Windows нужно установить драйвер USB для ADB. Руководство по установке и ссылки на драйверы OEM-производителей см. в документе OEM USB Drivers.
o Для Mac OS * X устанавливать дополнительные драйверы не нужно. Пропустите этот шаг.
o При использовании Ubuntu * Linux нужно добавить файл правил udev
, содержащий конфигурацию USB для каждого типа устройств, которые следует использовать при разработке. В файле правил каждый изготовитель устройств обозначается уникальным идентификатором с помощью свойства ATTR{idVendor}
. Список идентификаторов изготовителей см. в разделе Список идентификаторов изготовителей USBниже. Настройка обнаружения устройств в Ubuntu Linux:
Войдите в систему с правами root и создайте файл: /etc/udev/rules.d/51-android.rules
.
Добавьте в файл каждого изготовителя, используя следующий формат:SUBSYSTEM=="usb", ATTR{idVendor}=="<vendor id>", MODE="0666", GROUP="plugdev"
Примечание:Синтаксис правил может немного отличаться в зависимости от используемой среды. При необходимости ознакомьтесь с документацией udev
к системе. Описание синтаксиса см. в этом руководстве по написанию правил udev.
Теперь выполните команду:chmod a+r /etc/udev/rules.d/51-android.rules
При подключении через USB можно узнать, подключено ли устройство, выполнив команду ADB adb devices
из папки platform-tools/
. Если устройство подключено, то на экране будет показано имя устройства со словом device.
При загруженной ОС Android подключите кабель USB-OTG к порту (мини-USB типа b) на устройстве, а другой разъем кабеля — к порту (USB типа A) на компьютере.
Если все работает, то можно будет выполнить следующую команду для отображения подключенного устройства:
$ adb devices
* daemon not running. starting it now *
* daemon started successfully *
List of devices attached
0123456789ABCDEF device
Примечание:Чтобы узнать, какое имя устройства назначено этому подключению на компьютере с Linux, можно выполнить dmesg для поиска адреса usb-storage: device found at <num>, а затем отобразить список командой ls -l /dev/bus/usb/ *.
ADB в Windows *
Загрузите и установите Eclipse Classic по адресу http://www.eclipse.org/downloads/
Загрузите пакет Android * SDK для Windows * по адресу http://developer.android.com/sdk/index.html. (android-sdk_r18-windows.zip, or installer_r18-windows.exe).
После установки Android SDK файл adb.exe будет находиться в папке <install-dir>\android-sdk\platform-tools
Передача данных между сервером и клиентом в ADB
До этого мы обсуждали установку ADB на компьютере разработчика. На самом деле этот клиент — серверная программа, содержащая три компонента:
Клиент, запускаемый на компьютере разработчика. Можно вызвать клиент из оболочки с помощью команды ADB. Другие средства Android, такие как подключаемый модуль ADT и DDMS, также создают клиенты ADB.
Сервер, запускаемый на компьютере разработчика в виде фонового процесса. Сервер управляет обменом данными между клиентом и управляющей программой ADB на эмуляторе или на устройстве.
Управляющей программа, запускаемая на каждом экземпляре эмулятора или на каждом устройстве в виде фонового процесса.
При запуске клиента ADB клиент сначала проверяет, запущен ли уже процесс сервера ADB. Если нет, то клиент запускает процесс сервера. Сервер после запуска подключается к локальному TCP-порту 5037 и прослушивает команды, отправленные клиентами ADB. Все клиенты ADB используют порт 5037 для обмена данными с сервером ADB.
TЗатем сервер устанавливает подключения ко всем запущенным эмуляторам и устройствам. Для обнаружения эмуляторов и устройств сервер проверяет все порты с нечетными номерами в диапазоне от 5555 до 5585 (этот диапазон используется эмуляторами и устройствами). При обнаружении демона ADB устанавливается подключение к этому порту. Обратите внимание, что каждый эмулятор или устройство получает пару портов с последовательными номерами: порт с четным номером для подключения консоли и порт с нечетным номером для подключения ADB. Например:
Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557 ...
Как показано выше, к ADB на порте 5555 подключен тот экземпляр эмулятора, консоль которого прослушивает порт 5554.
После подключения сервера ко всем экземплярам эмулятора можно использовать команды ADB для управления этими экземплярами и доступа к ним. Сервер управляет подключениями к эмуляторам и устройствам и обрабатывает команды для нескольких клиентов ADB, поэтому можно управлять любым эмулятором или устройством с любого клиента (или с помощью сценария).
Запуск ADB
Введите "adb shell". Символ # указывает, что соединение успешно установлено.
$ adb shell
Основные команды ADB для устройств
Перечисленные ниже команды помогают передать отлаживаемое приложение на целевое устройство или в эмулятор с помощью командной строки. Это может быть удобно, особенно если отсутствует подключение терминала ssh.
adb push <local> <remote> - копирование файла или папки на устройство
adb pull <remote> [<local>] - копирование файла или папки с устройства
adb sync [ <directory> ] - копировать с компьютера на устройство только при наличии изменений
(-l отобразить список, но не копировать)
(см. 'adb help all')
adb shell - интерактивный запуск удаленной оболочки
adb shell <command> - выполнить удаленную команду оболочки<
adb emu <command> - выполнить команду консоли эмулятора<
adb logcat [ <filter-spec> ] - просмотр журнала устройства
adb forward <local> <remote> - перенаправлять подключения сокета. Параметры перенаправления:<
tcp:<port>>
localabstract:<unix domain socket
name>
localreserved:<unix domain socket
name>
localfilesystem:<unix domain socket name>
dev:<character device name>
jdwp:<process pid> (только удаленный)
adb jdwp - показать список всех PID процессов с транспортом JDWP
adb install [-l] [-r] [-s] <file> - передать файл пакета на устройство и установить его
('-l'блокировка пересылки приложения)
('-r'переустановить приложение, сохранив его данные
its data)
('-s'установить на карту памяти SD, а не во внутреннюю флеш-память)
adb uninstall [-k] <package> - удалить пакет приложения с устройства
('-k'сохранить папки данных и кэша)
Дополнительные сведения об установке и использовании ADB см. по адресу http://developer.android.com/guide/developing/tools/adb.html
Отладка нативного кода C/C++ с помощью отладчика GDB* - The GNU Project Debugger
Если отладка выполняется с помощью GDB, то задачи по обработке процесса передачи данных такой отладки выполняет gdbserver на устройстве, но можно использовать и драйвер USB-Ethernet с ADB для обработки транспортного уровня передачи данных, по которому gdbserver обменивается данными по протоколу TCP/IP с GDB на компьютере разработчика.
Существует приложение gdbclient, настраивающее среду обмена данными отладки и запускающее gdbserver на отлаживаемом устройстве.
Использование: gdbclient EXECUTABLE :PORT [PROG_PATH]
EXECUTABLE имя исполняемого файла (по умолчанию: app_process)
PORT порт подключения (по умолчанию:1234)
PROG_PATH полный путь к исполняемому файлу в целевой системе (например: /system/bin/mediaserver)
Если параметр PROG_PATH задан, gdclient пытается запустить gdbserver и присоединить его к запущенному PROG_PATH.
Для запуска gdbserver явным образом можно использовать следующую команду
# gdbserver :1234 --attach 269
Attached; pid = 269
Listening on port 1234
Приведенные ниже пошаговые инструкции по запуску сеанса отладки показывают, что ADB по-прежнему используется для передачи данных отладки, даже если отладка выполняется с помощью GDB, а не ADT или DDMS. Предположим, что используется порт 1234.
Запустите процесс:
gdbserver :1234 /system/bin/executable
или подключитесь к существующему процессу:
gdbserver :1234 --attach pid
Перенаправьте локальный порт 1234 рабочей станции на устройство с помощью adb:
adb forward tcp:1234 tcp:1234
Запустите особую версию gdb, находящуюся в области prebuilt структуры исходного кода:
prebuilt/Linux/toolchain-eabi-4.x.x/bin/i686-android-linux-gdb (for Linux)
prebuilt/darwin-x86/toolchain-eabi-4.x.x/bin/i686-android-linux-gdb (for Darwin)
Если особую версию GDB не удается найти, выполните команду find prebuilt –name i686-android-linux-gdbin в структуре исходного кода, чтобы найти и запустить последнюю версию.
Необходимо скопировать исполняемый файл в папку symbols, а не в главную папку Android, поскольку файл в главной папке очищен от символьной информации.
В GDB укажите расположение общих библиотек для загрузки:
set solib-absolute-prefix /absolute-source-path/out/target/product/product-name/symbols
set solib-search-path /absolute-source-path/out/target/product/product-name/symbols/system/lib
absolute-это путь к дереву исходного кода.
Следите за правильностью указываемых папок: GDB может не выдать сообщение в случае ошибки.
Подключитесь к устройству с помощью команды GDB:
(gdb) target remote :1234
Параметр :1234 указывает на подключение к порту 1234 локального компьютера, соединенному с устройством с помощью ADB.
Теперь можно начать отладку встроенного кода C/C++ на платформе Android * с помощью GDB привычным образом.
Дополнительные сведения см. в документации к GDB* - The GNU Project Debugger.
Использование подключаемого модуля ADT * для Eclipse * для отладки приложений Android *
Для устройств на базе архитектуры Intel® процесс установки не имеет существенных отличий от описанного по адресу http://developer.android.com/sdk/eclipse-adt.html#installing.
Подключаемый модуль средств отладки Android (ADT *) обеспечивает все возможности интегрированной отладки приложений в среде Eclipse * для эмуляторов и устройств с архитектурой Intel. Поддерживается два представления отладки с различными наборами функций.
Можно переключаться между ними по мере необходимости; каждое из них обладает определенными преимуществами.
Представление Debug в Eclipse *
Представление отладки в Eclipse предоставляет доступ к следующим вкладкам:
Debug - отображение уже отлаженных и отлаживаемых в настоящий момент приложений Android и запущенных в настоящий момент потоков
Variables - когда заданы точки останова, отображение значений переменных при выполнении кода
Breakpoints - список точек останова в коде приложения
LogCat - просмотр сообщений в журнале системы в реальном времени. Вкладка LogCat также доступна в представлении DDMS.
Чтобы открыть представление Debug Perspective, щелкните Window > Open Perspective > Debug. Дополнительные сведения см. в документации к отладчику Eclipse.
Представление DDMS
Представление DDMS в Eclipse обеспечивает доступ к всем функциям DDMS из среды разработки Eclipse. Доступны следующие разделы DDMS:
Devices — список физических и виртуальных устройств, подключенных к ADB.
Emulator Control — выполнение различных действий с устройством.
LogCat — просмотр сообщений в журнале системы в реальном времени.
Threads — отображение запущенных в настоящее время потоков в виртуальной машине.
Heap — использование кучи виртуальной машиной.
Allocation Tracker — просмотр выделения памяти объектам.
File Explorer — работа с файловой системой устройства.
Среда запуска приложений для отладки
При отладке приложения Android * для архитектуры Intel® разница заключается в настройке отладки целевого устройства.
Чтобы выбрать устройство с помощью диспетчера Android * Virtual Device Manager, входящего в состав Android * SDK, откройте меню Window>AVD Manager в Eclipse *. Необходимо выбрать Intel Atom в качестве целевого EABI для образа ОС и эмуляции устройства.
Если вы выполнили все описанные в начале этой статьи действия по установке ADB * и созданию моста отладки к физическому устройству, то в Eclipse появится меню выбора устройства, где можно выбрать целевое устройство для развертывания приложения и его отладки.
В остальном отладка приложения Android * для архитектуры Intel® практически не отличается от отладки приложений Android * для архитектуры ARM *.
Действуют все правила и инструкции, приведенные по адресу http://developer.android.com/guide/developing/debugging/index.html.