Особенности подключения и ограничения интерфейса:
У спецустройств три типовые проблемы. Первая, физический доступ: USB-порт телевизора обычно работает в режиме хоста (для флешек и клавиатур), у часов проводного канала данных нет вовсе, в автомобиле разъём спрятан и залочен. Поэтому базовый транспорт здесь сеть, всё из главы 20 про беспроводную отладку применимо напрямую.
Вторая, авторизация. Диалог "Разрешить отладку?" на телевизоре подтверждается пультом, на часах пальцем по крошечному экрану, а на безэкранной железке его никто не увидит, и устройство навсегда висит в unauthorized. Третья, энергосбережение: телевизор в standby и уснувшие часы рвут TCP-соединение, это причина номер один загадочных offline.
Класс устройства определяется за секунду:
Код: Выделить всё
adb shell getprop ro.build.characteristics
tv
Код: Выделить всё
adb shell pm list features | grep -E "leanback|watch|automotive"
feature:android.software.leanback
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
Пульт целиком эмулируется через 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"
У TV-приложений своя лаунчер-категория, поэтому запуск через monkey выглядит так:
Код: Выделить всё
adb shell monkey -p com.example.tvapp -c android.intent.category.LEANBACK_LAUNCHER 1
Код: Выделить всё
adb: failed to install app.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: ...]
Код: Выделить всё
adb shell dumpsys hdmi_control
Код: Выделить всё
adb shell settings put global hdmi_control_enabled 1
Код: Выделить всё
adb shell cmd hdmi_control cec_setting get hdmi_cec_enabled
adb shell cmd hdmi_control onetouchplay
Скриншоты с ТВ снимаются как обычно, но DRM-контент в плеерах уйдёт чёрным прямоугольником, это защита на уровне композитора, обойти её штатно нельзя:
Код: Выделить всё
adb exec-out screencap -p > tv.png
Современные часы (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
Код: Выделить всё
adb forward tcp:4444 localabstract:/adb-hub
adb connect 127.0.0.1:4444
connected to 127.0.0.1:4444
Скриншот с круглого экрана приходит квадратным PNG, углы за маской просто чёрные:
Код: Выделить всё
adb -s 192.168.1.77:5555 exec-out screencap -p > watch.png
Код: Выделить всё
adb shell screenrecord --size 480x480 --time-limit 30 /sdcard/wear.mp4
adb pull /sdcard/wear.mp4
Код: Выделить всё
adb -s 192.168.1.77:5555 install -r -g wear-release.apk
Performing Streamed Install
Success
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
Код: Выделить всё
adb shell cmd car_service inject-vhal-event 0x11600207 23.5
Код: Выделить всё
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
Встраиваемые платформы, отдельный мир. Android Things закрыт ещё в начале 2022, но AOSP живёт в кассах, платёжных терминалах, инфокиосках, вендингах и операторских приставках, в СНГ это, например, терминалы Эвотор или телевизоры с YaOS (форк AOSP). Подключение либо по сети, либо через OTG. На userdebug и eng сборках доступно то, что на телефонах требует танцев:
Код: Выделить всё
adb root
restarting adbd as root
adb remount
remount succeeded
Код: Выделить всё
adb shell su -c "setprop service.adb.tcp.port 5555 && stop adbd && start adbd"
adb connect 10.0.0.15:5555
Код: Выделить всё
adb push ~/.android/adbkey.pub /data/misc/adb/adb_keys
adb shell chmod 640 /data/misc/adb/adb_keys
Сводка частых ошибок:
Код: Выделить всё
failed to connect to '192.168.1.50:5555': Connection refused
Код: Выделить всё
adb: device unauthorized
Код: Выделить всё
adb: more than one device/emulator
Состояние offline после сна устройства лечится adb disconnect с адресом и повторным connect, в упрямых случаях adb kill-server.
В следующей главе спустимся ещё ниже: recovery, sideload и fastboot, то есть случаи, когда система уже не загружается, а ADB всё ещё нужен.