Взаимодействие с эмуляторами

Рейтинг: 67.6% · 8 голосов
Полный курс по Android Debug Bridge: установка, подключение, shell, логи, dumpsys, автоматизация, root, беспроводная отладка. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
android_roman
Сообщения: 45
Зарегистрирован: 11 май 2026, 05:31

Взаимодействие с эмуляторами

Сообщение android_roman »

АкадемияADB: Android Debug BridgeГлава 21 из 29
Оглавление курса (29)
  1. Введение в Android Debug Bridge
  2. Установка и настройка рабочей среды
  3. Подключение устройства (проводное и беспроводное)
  4. Базовые команды ADB и управление сервером
  5. Команды состояния и перезагрузки
  6. Навигация по файловой системе
  7. Управление пакетами приложений
  8. Логирование с помощью logcat
  9. Системные дампы и диагностика (dumpsys)
  10. Анализ производительности в реальном времени
  11. Эмуляция ввода (input)
  12. Управление Activity и Intent (am)
  13. Работа с оконным менеджером (wm)
  14. Захват экрана и запись видео
  15. Root-доступ и его применение
  16. Модификация системных настроек через settings
  17. Команды для поставщиков контента (content)
  18. Резервное копирование и восстановление (backup)
  19. Проброс портов и туннелирование
  20. Беспроводная отладка (Wi-Fi)
  21. Взаимодействие с эмуляторами (вы здесь)
  22. Написание скриптов на Bash/CMD/PowerShell
  23. ADB в языках программирования
  24. Автоматизация тестирования с ADB
  25. Безопасность и лучшие практики
  26. ADB на Android TV, Wear OS и IoT
  27. Восстановление и низкоуровневые операции
  28. Расширенные возможности оболочки и инструменты
  29. Отладка самого ADB и устранение неполадок
Эмулятор для ADB, это почти обычное устройство, но с парой особенностей: предсказуемые порты, собственная консоль управления и виртуальное железо, которым можно крутить как угодно. В главе 3 мы подключали физические устройства, здесь разберем виртуальные. Все примеры проверены на эмуляторе из Android Studio (Android Emulator 35.x, системные образы Android 14/15) и свежих Platform Tools.

Порты 5554/5555 и как эмулятор виден серверу ADB:

Каждый запущенный экземпляр эмулятора занимает пару последовательных TCP-портов на localhost. Четный порт (по умолчанию 5554) это консоль эмулятора, нечетный (5555) слушает ADB. Серийный номер устройства собирается из консольного порта: emulator-5554, emulator-5556 и так далее. Второй экземпляр займет 5556/5557, третий 5558/5559, всего по умолчанию до 16 пар (5554-5585).

Код: Выделить всё

$ emulator -list-avds
Pixel_8_API_35
Pixel_Tablet_API_34

$ emulator -avd Pixel_8_API_35 &
$ adb devices -l
List of devices attached
emulator-5554          device product:sdk_gphone64_x86_64 model:sdk_gphone64_x86_64 device:emu64xa transport_id:1
Бинарник emulator лежит в $ANDROID_HOME/emulator, не путайте со старым из каталога tools, его давно удалили из SDK. Порт можно задать явно, это спасает в CI, где несколько джоб не должны драться за 5554:

Код: Выделить всё

$ emulator -avd Pixel_8_API_35 -port 5560
$ adb devices
List of devices attached
emulator-5560   device
Флаг -port принимает только четные значения из диапазона 5554-5584. Если нужно задать оба порта вручную, есть -ports 5560,5561.

Сервер ADB сам сканирует нечетные порты 5555-5585 на localhost, поэтому эмулятор появляется в adb devices без всякого adb connect. Отсюда ловушка: если вручную выполнить adb connect 127.0.0.1:5555 при запущенном эмуляторе, в списке окажутся и emulator-5554, и 127.0.0.1:5555, а это одно устройство двумя записями. Лишнюю запись убирает adb disconnect 127.0.0.1:5555.

adb -e и несколько AVD:

Флаг -e адресует команду эмулятору, -d устройству по USB. Удобно, когда телефон и эмулятор воткнуты одновременно:

Код: Выделить всё

$ adb -e install -r app-debug.apk
Performing Streamed Install
Success

$ adb -d logcat -d -t 20
Нюанс свежих Platform Tools: -e формально означает "единственное TCP/IP устройство". Телефон, подключенный по Wi-Fi из главы 20, тоже под него попадает. Как только таких устройств два и больше, -e отваливается:

Код: Выделить всё

$ adb -e shell getprop ro.build.version.release
adb: more than one emulator detected; use -s to specify
Лечится явным серийником через -s или переменной окружения ANDROID_SERIAL:

Код: Выделить всё

$ adb -s emulator-5554 shell getprop ro.build.version.release
15
$ ANDROID_SERIAL=emulator-5556 adb shell getprop ro.build.version.release
14
Два экземпляра одного и того же AVD просто так не поднять, второй упрется в блокировку образа. С версии эмулятора 28 есть обход, флаг -read-only, копия стартует без записи на диск:

Код: Выделить всё

$ emulator -avd Pixel_8_API_35 -read-only -port 5556 &
Для CI пригодятся -no-window -no-audio (headless), -no-snapshot-load (холодный старт), -wipe-data (чистый образ). И ожидание полной загрузки, потому что wait-for-device срабатывает раньше, чем система реально доехала:

Код: Выделить всё

$ adb -s emulator-5554 wait-for-device shell \
  'while [ "$(getprop sys.boot_completed)" != "1" ]; do sleep 1; done; echo booted'
booted
Консоль эмулятора:

Четный порт пары, это телнет-консоль. Через нее управляют виртуальным железом: сенсорами, сетью, батареей, GPS, телефонией. С версии 25 консоль требует аутентификацию токеном из файла ~/.emulator_console_auth_token:

Код: Выделить всё

$ telnet localhost 5554
Android Console: Authentication required
Android Console: type 'auth <auth_token>' to authenticate
Android Console: you can find your <auth_token> in
'/Users/dev/.emulator_console_auth_token'
OK
auth Kp7mQ2xL9aRtW3vY
Android Console: type 'help' for a list of commands
OK
На Windows телнет-клиент по умолчанию выключен. Можно его не включать вовсе: adb emu шлет те же команды в консоль и сам подставляет токен:

Код: Выделить всё

$ adb -s emulator-5554 emu avd name
Pixel_8_API_35
OK
Дальше примеры через adb emu, в telnet команды те же, только без префикса.

Сенсоры:

Код: Выделить всё

$ adb emu sensor get acceleration
acceleration = 0:9.77622:0.812348
OK
$ adb emu sensor set acceleration 0:0:-9.81
OK
Формат значений x:y:z через двоеточие. Пример выше кладет устройство экраном вниз, а дефолтные 0:9.81:0 это вертикальный портрет. Так тестируют реакцию приложения на положение в пространстве без UI эмулятора, в том числе в headless-режиме. Поворот экрана целиком делается отдельной командой:

Код: Выделить всё

$ adb emu rotate
OK
Сеть, телефония, GPS, батарея:

Эмуляция плохой сети, обязательный тест, если у аудитории за пределами больших городов до сих пор местами EDGE:

Код: Выделить всё

$ adb emu network speed edge
OK
$ adb emu network delay umts
OK
$ adb emu network status
Current network status:
  download speed:   473600 bits/s (57.8 KB/s)
  upload speed:     473600 bits/s (57.8 KB/s)
  minimum latency:  35 ms
  maximum latency:  200 ms
OK
Доступные профили скорости: gsm, hscsd, gprs, edge, umts, hsdpa, lte, evdo, full. Возврат к норме: network speed full и network delay none.

Входящий звонок и SMS:

Код: Выделить всё

$ adb emu gsm call +79161234567
OK
$ adb emu gsm accept +79161234567
OK
$ adb emu gsm cancel +79161234567
OK
$ adb emu sms send +79161234567 "Vash kod 4821"
OK
Консоль плохо дружит с кириллицей в SMS, текст может прийти кракозябрами. Шлите латиницей или через Extended Controls в окне эмулятора.

GPS. Внимание на порядок аргументов, сначала долгота, потом широта. Москва выглядит так:

Код: Выделить всё

$ adb emu geo fix 37.6173 55.7558
OK
Батарея и питание (проверять результат удобно через dumpsys battery из главы 9):

Код: Выделить всё

$ adb emu power capacity 7
OK
$ adb emu power ac off
OK
$ adb emu power status not-charging
OK
Сетевые адреса внутри эмулятора фиксированные: 10.0.2.2 это loopback хоста (так приложение в госте стучится к вашему локальному бекенду), 10.0.2.15 собственный адрес гостя, 10.0.2.3 виртуальный DNS. Проброс порта снаружи внутрь делается командой redir, это дополнение к adb forward/reverse из главы 19:

Код: Выделить всё

$ adb emu redir add tcp:8085:8080
OK
$ adb emu redir list
tcp:8085  => 8080
OK
Подключение на localhost:8085 хоста теперь уходит на порт 8080 внутри гостя.

Погасить эмулятор тоже можно отсюда:

Код: Выделить всё

$ adb -s emulator-5554 emu kill
OK: killing emulator, bye bye
Genymotion:

Genymotion Desktop гоняет Android в виртуальной машине (VirtualBox, в свежих версиях QEMU), и для ADB его устройства выглядят как сетевые. Подключение идет на адрес host-only сети, Genymotion делает adb connect сам:

Код: Выделить всё

$ adb devices
List of devices attached
192.168.56.101:5555    device
Серийник тут IP:порт, а не emulator-NNNN. Под флаг -e такое устройство тоже попадает (TCP/IP транспорт), так что при включенном Genymotion и AVD одновременно пишите -s.

Главная грабля Genymotion, конфликт версий ADB. В комплекте идет собственный бинарник adb, и если его версия отличается от вашей из Platform Tools, серверы будут по очереди убивать друг друга:

Код: Выделить всё

adb server version (40) doesn't match this client (41); killing...
Лечится в настройках: Settings, вкладка ADB, пункт Use custom Android SDK tools, указываете каталог своего SDK. После этого все ходит через один adb.

Сторонние эмуляторы (Nox, MEmu, MuMu, BlueStacks, LDPlayer):

Игровые эмуляторы тоже умеют ADB, но вешают его на свои порты и почти все таскают переименованный adb с собой. Типичные адреса первого экземпляра:

Код: Выделить всё

$ adb connect 127.0.0.1:62001   # Nox
$ adb connect 127.0.0.1:21503   # MEmu
$ adb connect 127.0.0.1:7555    # MuMu (классический, MuMu 12 слушает 16384)
$ adb connect 127.0.0.1:5555    # LDPlayer
Вторые и последующие экземпляры получают другие порты (у Nox это 62025, 62026 и далее), точные значения смотрите в настройках мультиплеера конкретного эмулятора. У BlueStacks 5 ADB сначала включается в Settings, раздел Advanced, там же показан назначенный порт. После connect устройство ведет себя как обычное:

Код: Выделить всё

$ adb connect 127.0.0.1:62001
connected to 127.0.0.1:62001
$ adb -s 127.0.0.1:62001 shell getprop ro.product.model
SM-G988N
Два предостережения. Первое: nox_adb.exe и HD-Adb.exe (BlueStacks) это старые версии adb, при старте эмулятора они могут прибить ваш сервер, симптом тот же version doesn't match. Рабочее решение, заменить бинарник в каталоге эмулятора копией своего adb.exe, сохранив имя файла, но после обновления эмулятора файл вернется. Второе: Android внутри игровых эмуляторов обычно старый (9-11), рутованный и x86 с трансляцией ARM-кода, поведение приложений отличается от реальных устройств. Для функционального тестирования это плохая замена AVD, их ниша, массовые фермы и игры.

Частые ошибки:

emulator-5554 offline сразу после старта, нормально первые секунды. Если висит минутами, перезапустите сервер, как в главе 4:

Код: Выделить всё

$ adb kill-server && adb start-server
error: more than one device/emulator, значит забыли -s или ANDROID_SERIAL.

KO: bad auth token в консоли: токен скопирован с переводом строки, либо эмулятор запущен от другого пользователя и читает другой ~/.emulator_console_auth_token.

emulator: command not found: каталог $ANDROID_HOME/emulator не добавлен в PATH.

Эмулятор на нестандартном порту выше 5585 не появляется в adb devices: сервер сканирует только 5555-5585, подключайтесь вручную через adb connect localhost:НЕЧЕТНЫЙ_ПОРТ.

В следующей главе соберем все это в скрипты: поднять AVD, дождаться загрузки, прогнать сценарий, погасить.
👍3 ❤️2 🔥 😄 🤔1
✔ Лучший ответ сформирован автоматически — scalanerd
android_roman писал(а):Внимание на порядок аргументов, сначала долгота, потом широта вот из-за этого убил час времени. ставил координаты Минска как привык, широта-долгота, и приложение упорно рисовало меня где-то в Сомали. почему в geo fix порядок перевернутый, если в Extended Controls студии поля идут наоборот?
Перейти к ответу →
Аватара пользователя
scalanerd
Сообщения: 1
Зарегистрирован: 31 май 2026, 07:24

Re: Взаимодействие с эмуляторами

Сообщение scalanerd »

✔ Лучший ответ — сформирован автоматически
android_roman писал(а):Внимание на порядок аргументов, сначала долгота, потом широта
вот из-за этого убил час времени. ставил координаты Минска как привык, широта-долгота, и приложение упорно рисовало меня где-то в Сомали. почему в geo fix порядок перевернутый, если в Extended Controls студии поля идут наоборот?
👍1 ❤️1 🔥 😄 🤔1
Аватара пользователя
tinkus
Сообщения: 3
Зарегистрирован: 12 май 2026, 17:49

Re: Взаимодействие с эмуляторами

Сообщение tinkus »

то есть если у меня рабочий телефон висит по wifi из 20 главы, то adb -e install может прилететь в него, а не в эмулятор?? хорошо что прочитал до того как накатил тестовую сборку поверх прода. получается -e вообще нельзя доверять и проще везде писать -s?
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
Chandi
Сообщения: 1
Зарегистрирован: 15 май 2026, 13:22

Re: Взаимодействие с эмуляторами

Сообщение Chandi »

подтверждаю про подмену nox_adb.exe, только есть нюанс: нокс после своего апдейта молча возвращает старый бинарник и цирк с killing... начинается заново. я перестал бороться и просто в начале скрипта делаю adb kill-server, потом connect, живет нормально.
👍2 ❤️ 🔥 😄 🤔
Аватара пользователя
FpgaEnjoyer
Сообщения: 1
Зарегистрирован: 07 июн 2026, 02:45

Re: Взаимодействие с эмуляторами

Сообщение FpgaEnjoyer »

а на gitlab-раннере без kvm это все вообще поднимется? у нас shared runner в облаке, emulator -no-window стартует и висит на черном экране бесконечно. читал что без аппаратной виртуализации x86 образы практически мертвые, так и есть или есть обход через -gpu swiftshader_indirect?
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Беспроводная отладка (Wi-Fi)
Следующая глава →
Написание скриптов на Bash/CMD/PowerShell

Все главы курса «ADB: Android Debug Bridge»

Поделиться темой: ✈ Telegram VK

Вернуться в «ADB: Android Debug Bridge»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость