Порты 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 -avd Pixel_8_API_35 -port 5560
$ adb devices
List of devices attached
emulator-5560 device
Сервер 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
Код: Выделить всё
$ adb -e shell getprop ro.build.version.release
adb: more than one emulator detected; use -s to specify
Код: Выделить всё
$ adb -s emulator-5554 shell getprop ro.build.version.release
15
$ ANDROID_SERIAL=emulator-5556 adb shell getprop ro.build.version.release
14
Код: Выделить всё
$ emulator -avd Pixel_8_API_35 -read-only -port 5556 &
Код: Выделить всё
$ 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
Код: Выделить всё
$ adb -s emulator-5554 emu avd name
Pixel_8_API_35
OK
Сенсоры:
Код: Выделить всё
$ adb emu sensor get acceleration
acceleration = 0:9.77622:0.812348
OK
$ adb emu sensor set acceleration 0:0:-9.81
OK
Код: Выделить всё
$ adb emu rotate
OK
Эмуляция плохой сети, обязательный тест, если у аудитории за пределами больших городов до сих пор местами 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
Входящий звонок и 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
GPS. Внимание на порядок аргументов, сначала долгота, потом широта. Москва выглядит так:
Код: Выделить всё
$ adb emu geo fix 37.6173 55.7558
OK
Код: Выделить всё
$ adb emu power capacity 7
OK
$ adb emu power ac off
OK
$ adb emu power status not-charging
OK
Код: Выделить всё
$ adb emu redir add tcp:8085:8080
OK
$ adb emu redir list
tcp:8085 => 8080
OK
Погасить эмулятор тоже можно отсюда:
Код: Выделить всё
$ adb -s emulator-5554 emu kill
OK: killing emulator, bye bye
Genymotion Desktop гоняет Android в виртуальной машине (VirtualBox, в свежих версиях QEMU), и для ADB его устройства выглядят как сетевые. Подключение идет на адрес host-only сети, Genymotion делает adb connect сам:
Код: Выделить всё
$ adb devices
List of devices attached
192.168.56.101:5555 device
Главная грабля Genymotion, конфликт версий ADB. В комплекте идет собственный бинарник adb, и если его версия отличается от вашей из Platform Tools, серверы будут по очереди убивать друг друга:
Код: Выделить всё
adb server version (40) doesn't match this client (41); killing...
Сторонние эмуляторы (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
Код: Выделить всё
$ 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
Частые ошибки:
emulator-5554 offline сразу после старта, нормально первые секунды. Если висит минутами, перезапустите сервер, как в главе 4:
Код: Выделить всё
$ adb kill-server && adb start-server
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, дождаться загрузки, прогнать сценарий, погасить.