ADB на Android TV, Wear OS и IoT

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

ADB на Android TV, Wear OS и IoT

Сообщение android_roman »

АкадемияADB: Android Debug BridgeГлава 26 из 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 есть, а привычного интерфейса нет. Телевизором управляют пультом, у часов экран размером с монету, у автомобильной магнитолы отладка закрыта вендором, а у кассового терминала экран занят чеком. Сам протокол везде одинаковый, команды с 4 по 25 главу работают без изменений. Меняются транспорт, способ авторизации и приёмы вокруг ввода-вывода.

Особенности подключения и ограничения интерфейса:

У спецустройств три типовые проблемы. Первая, физический доступ: USB-порт телевизора обычно работает в режиме хоста (для флешек и клавиатур), у часов проводного канала данных нет вовсе, в автомобиле разъём спрятан и залочен. Поэтому базовый транспорт здесь сеть, всё из главы 20 про беспроводную отладку применимо напрямую.

Вторая, авторизация. Диалог "Разрешить отладку?" на телевизоре подтверждается пультом, на часах пальцем по крошечному экрану, а на безэкранной железке его никто не увидит, и устройство навсегда висит в unauthorized. Третья, энергосбережение: телевизор в standby и уснувшие часы рвут TCP-соединение, это причина номер один загадочных offline.

Класс устройства определяется за секунду:

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

adb shell getprop ro.build.characteristics
tv
На часах вернётся nosdcard,watch, в автомобильном образе automotive. Точнее через фичи:

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

adb shell pm list features | grep -E "leanback|watch|automotive"
feature:android.software.leanback
android.software.leanback значит телевизор, android.hardware.type.watch часы, android.hardware.type.automotive автомобиль. Это удобно в скриптах из главы 22, когда один сценарий обслуживает разнотипный парк.

Android TV: ввод, пульт, HDMI-CEC:

Режим разработчика включается как на телефоне: Настройки, Система, Об устройстве, семь нажатий на номер сборки. Дальше в Developer options включаете USB debugging и Network debugging (на части прошивок пункт называется "Отладка по сети" или ADB over network). Подключение:

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

adb connect 192.168.1.50:5555
connected to 192.168.1.50:5555

adb devices
List of devices attached
192.168.1.50:5555	device
Если connection refused, проверьте, что сетевая отладка включена и телевизор не в standby. После выключения пультом adbd умирает вместе с остальной системой, на многих моделях спасает включённый быстрый старт (networked standby).

Пульт целиком эмулируется через input keyevent из главы 11. Рабочий набор для навигации:

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

adb shell input keyevent KEYCODE_DPAD_UP       # 19
adb shell input keyevent KEYCODE_DPAD_DOWN     # 20
adb shell input keyevent KEYCODE_DPAD_LEFT     # 21
adb shell input keyevent KEYCODE_DPAD_RIGHT    # 22
adb shell input keyevent KEYCODE_DPAD_CENTER   # 23, кнопка OK
adb shell input keyevent KEYCODE_BACK          # 4
adb shell input keyevent KEYCODE_HOME          # 3
adb shell input keyevent 85                    # play/pause
adb shell input keyevent 224                   # разбудить (WAKEUP)
adb shell input keyevent 223                   # усыпить (SLEEP)
Текст с компьютера набирается на порядок быстрее, чем пультом по экранной клавиатуре:

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

adb shell input text "the%sexpanse"
%s подставляет пробел. Кириллицу input text не передаёт, это ограничение самой команды, а не телевизора.

У TV-приложений своя лаунчер-категория, поэтому запуск через monkey выглядит так:

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

adb shell monkey -p com.example.tvapp -c android.intent.category.LEANBACK_LAUNCHER 1
Установка обычная. Причём adb install не проверяет uses-feature, так что телефонные APK без leanback-активности ставятся спокойно, просто в лаунчере их не будет, запускать придётся по полному имени Activity через am start (глава 12). Реальный подводный камень другой: бюджетные свистки бывают 32-битными, и arm64-only сборка даст

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

adb: failed to install app.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: ...]
Теперь HDMI-CEC. Это шина, по которой приставка будит телевизор, переключает вход и громкость. За неё отвечает сервис hdmi_control:

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

adb shell dumpsys hdmi_control
В дампе видно логические адреса устройств на шине, состояние питания и настройки CEC. Первое, что стоит там проверять: видит ли приставка телевизор вообще. На старых прошивках CEC включается флагом в глобальных настройках:

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

adb shell settings put global hdmi_control_enabled 1
На Android 12 и новее настройки CEC переехали внутрь сервиса, и появился shell-интерфейс:

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

adb shell cmd hdmi_control cec_setting get hdmi_cec_enabled
adb shell cmd hdmi_control onetouchplay
onetouchplay выполняет сценарий One Touch Play: приставка объявляет себя активным источником, телевизор просыпается и переключается на её вход. Команда имеет смысл на playback-устройствах (приставки, свистки), а не на самом телевизоре. Если cmd отвечает, что такой команды нет, у вас Android старее 12, остаются dumpsys и settings.

Скриншоты с ТВ снимаются как обычно, но DRM-контент в плеерах уйдёт чёрным прямоугольником, это защита на уровне композитора, обойти её штатно нельзя:

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

adb exec-out screencap -p > tv.png
Wear OS: скриншоты, установка приложений:

Современные часы (Pixel Watch, Galaxy Watch 4 и новее) не имеют проводного канала данных, зарядный пятак только питает. Режим разработчика включается семью нажатиями на номер сборки в настройках часов, дальше два пути.

Путь первый, классический: пункт "Отладка по Wi-Fi" в Developer options. Часы показывают адрес вида 192.168.1.77:5555, дальше обычный adb connect. Путь второй, на Wear OS 4 и новее (база Android 13): полноценная беспроводная отладка с пайрингом, ровно как в главе 20:

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

adb pair 192.168.1.77:42137
Enter pairing code: 482915
Successfully paired to 192.168.1.77:42137

adb connect 192.168.1.77:40551
connected to 192.168.1.77:40551
Запасной вариант без Wi-Fi, мост через Bluetooth телефона-компаньона. На часах включается "Отладка по Bluetooth", в приложении-компаньоне на телефоне тоже, сам телефон подключён по USB, дальше:

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

adb forward tcp:4444 localabstract:/adb-hub
adb connect 127.0.0.1:4444
connected to 127.0.0.1:4444
Скорость там единицы килобайт в секунду: для logcat хватает, установка APK мучительна. По Wi-Fi всегда быстрее.

Скриншот с круглого экрана приходит квадратным PNG, углы за маской просто чёрные:

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

adb -s 192.168.1.77:5555 exec-out screencap -p > watch.png
Флаг -s обязателен, когда параллельно подключён телефон, иначе поймаете "more than one device/emulator". Запись видео на Wear OS 3+ тоже работает, разрешение лучше задать явно под экран (480x480 у Galaxy Watch 6, 384x384 у первых Pixel Watch):

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

adb shell screenrecord --size 480x480 --time-limit 30 /sdcard/wear.mp4
adb pull /sdcard/wear.mp4
Установка с Wear OS 3 честная: часовой APK ставится прямо на часы, старой схемы с вложением во "взрослое" приложение телефона больше нет.

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

adb -s 192.168.1.77:5555 install -r -g wear-release.apk
Performing Streamed Install
Success
-g сразу выдаёт runtime-разрешения, тыкать диалоги на часах особенно неудобно. Главные грабли Wear, это сон: часы агрессивно гасят Wi-Fi для экономии батареи, и соединение рвётся каждые несколько минут. На время отладки держите часы на зарядке с включённым Stay awake while charging и не удивляйтесь смене IP после переподключения к точке.

Android Automotive и встраиваемые платформы:

Не путайте Android Auto и Android Automotive OS. Auto, это проекция: приложение крутится на телефоне, и отлаживается телефон, всё как в главах 7-12. Automotive (AAOS), это полноценный Android внутри головного устройства, как у Polestar, Volvo, Renault и растущего списка китайских марок. В серийной машине adbd закрыт production-сборкой, поэтому повседневная разработка идёт на эмуляторе из Android Studio: ставите системный образ Automotive (API 33-35) и получаете обычный emulator-5554 со всеми приёмами главы 21.

Сердце AAOS, сервис car_service:

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

adb shell dumpsys car_service
Самое полезное, инъекция данных автомобиля через VHAL. Скорость, свойство PERF_VEHICLE_SPEED с id 0x11600207:

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

adb shell cmd car_service inject-vhal-event 0x11600207 23.5
После этого срабатывают UX restrictions, и приложение обязано спрятать клавиатуру, видео и длинные списки, ровно это проверяют при публикации в автомобильные каталоги. Связанные команды:

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

adb shell cmd car_service day-night-mode night
adb shell cmd car_service emulate-driving-state drive
adb shell cmd car_service emulate-driving-state park
day-night-mode переключает тему интерфейса, emulate-driving-state (образы Android 13 и новее) симулирует состояние движения целиком, без ручного подбора свойств.

Встраиваемые платформы, отдельный мир. Android Things закрыт ещё в начале 2022, но AOSP живёт в кассах, платёжных терминалах, инфокиосках, вендингах и операторских приставках, в СНГ это, например, терминалы Эвотор или телевизоры с YaOS (форк AOSP). Подключение либо по сети, либо через OTG. На userdebug и eng сборках доступно то, что на телефонах требует танцев:

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

adb root
restarting adbd as root

adb remount
remount succeeded
Если adbd слушает только USB, на рутованной сборке переводим его в TCP (root, глава 15):

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

adb shell su -c "setprop service.adb.tcp.port 5555 && stop adbd && start adbd"
adb connect 10.0.0.15:5555
Чтобы headless-устройство не застревало в unauthorized, публичный ключ кладут заранее, на этапе сборки образа или через recovery (глава 27). При живом root-доступе это выглядит так:

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

adb push ~/.android/adbkey.pub /data/misc/adb/adb_keys
adb shell chmod 640 /data/misc/adb/adb_keys
Понятно, что запушить ключ можно только когда доступ уже есть, поэтому на проде это часть процесса прошивки, а не операция постфактум. И не оставляйте боевые киоски с ro.adb.secure=0: открытый ADB на устройстве с деньгами, это подарок злоумышленнику, глава 25 целиком об этом.

Сводка частых ошибок:

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

failed to connect to '192.168.1.50:5555': Connection refused
Сетевая отладка выключена либо устройство спит. Будите физически или включайте быстрый старт.

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

adb: device unauthorized
Ищите диалог на экране устройства: на ТВ листайте пультом, на часах его легко проморгать. Радикальный вариант, "Отозвать авторизации отладки" в Developer options и переподключение.

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

adb: more than one device/emulator
Телефон, часы и эмулятор подключены одновременно. Всегда указывайте -s с серийником вида ip:port.

Состояние offline после сна устройства лечится adb disconnect с адресом и повторным connect, в упрямых случаях adb kill-server.

В следующей главе спустимся ещё ниже: recovery, sideload и fastboot, то есть случаи, когда система уже не загружается, а ADB всё ещё нужен.
👍4 ❤️5 🔥3 😄 🤔
✔ Лучший ответ сформирован автоматически — Deleterious
делал автотесты для тв приложения, подтверждаю про standby: самсунги с networked standby держат adbd в дежурке нормально, а дешевые боксы на amlogic отваливаются наглухо. мы просто включили screen always on в developer options и забыли про проблему. и да, кириллица в input text это боль, ставили ADBKeyboard и слали русский текст бродкастом, для поиска в кинотеатрах работает отлично
Перейти к ответу →
Аватара пользователя
Deleterious
Сообщения: 1
Зарегистрирован: 20 май 2026, 03:10

Re: ADB на Android TV, Wear OS и IoT

Сообщение Deleterious »

✔ Лучший ответ — сформирован автоматически
делал автотесты для тв приложения, подтверждаю про standby: самсунги с networked standby держат adbd в дежурке нормально, а дешевые боксы на amlogic отваливаются наглухо. мы просто включили screen always on в developer options и забыли про проблему. и да, кириллица в input text это боль, ставили ADBKeyboard и слали русский текст бродкастом, для поиска в кинотеатрах работает отлично
👍1 ❤️3 🔥 😄 🤔
Аватара пользователя
bunops
Сообщения: 2
Зарегистрирован: 27 май 2026, 20:05

Re: ADB на Android TV, Wear OS и IoT

Сообщение bunops »

android_roman писал(а):Понятно, что запушить ключ можно только когда доступ уже есть
а если парк киосков уже в поле и adb там заперт? у нас сотня штук на android 9, до половины физически не доехать. получается единственный путь это OTA с новым образом, или есть еще варианты которые я не вижу?
👍2 ❤️ 🔥 😄 🤔1
Аватара пользователя
andrei98
Сообщения: 2
Зарегистрирован: 24 май 2026, 02:23

Re: ADB на Android TV, Wear OS и IoT

Сообщение andrei98 »

а inject-vhal-event на реальной машине кто-нибудь пробовал? если допустим есть инженерный доступ к головному устройству, vhal примет инъекцию или там на проде это закрыто так же как adbd? интересно чисто для стенда из б/у магнитолы
👍1 ❤️2 🔥 😄 🤔
Аватара пользователя
Rcampos
Сообщения: 1
Зарегистрирован: 29 май 2026, 09:16

Re: ADB на Android TV, Wear OS и IoT

Сообщение Rcampos »

по часам дополню: на galaxy watch 5 пункт отладки по wifi серый, пока часы реально не подцепятся к точке. и они стабильно отваливаются от 5 ГГц, держите их на 2.4, сэкономите нервы. ip после каждого сна скачет, я в скрипте тупо перебираю последний октет подсети пока connect не ответит
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Безопасность и лучшие практики
Следующая глава →
Восстановление и низкоуровневые операции

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

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

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

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

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