Перейти к содержанию

Станция Макс — ADB Max

Сервисная отладка и выполнение административных команд на Яндекс Станции Макс (yandexstation_2, YNDX-0008) через стандартный сетевой сеанс ADB без изменения системных разделов.

Особенности платформы

На Станции Макс установлена операционная система Android TV (YaOS_X, Android 9). В отличие от моделей на Buildroot, здесь действует заводская защита целостности (Android Verified Boot, dm-verity). Системный сервис adbd собран в режиме production, а команда adb root возвращает adbd cannot run as root in production builds.

Обычный DNS-метод на Максе неприменим, так как служебные скрипты activate_adb.sh и onboot.sh на этой платформе отсутствуют.

Здесь используется отдельный сервисный подход — выполнение команд с повышенными привилегиями в оперативной памяти через существующую сессию ADB.

Подробные исходные материалы проекта доступны в репозитории автора.

Что понадобится

  • Станция Макс на прошивке PPR1.180610.011.20220415, ядро 4.9.113-g985a1e6b;
  • Сетевой доступ к порту 5555;
  • Компьютер с установленной утилитой adb;
  • Android NDK (проверено на r26d) и Python 3 — для сборки вспомогательной утилиты.

Прошивку не обновляйте до и во время работы: при смене версии ядра системные адреса меняются.

1. Проверка версии прошивки

Параметры утилиты рассчитаны на конкретную сборку системы. Перед началом проверьте свойства устройства:

adb shell getprop ro.build.fingerprint

Ожидаемый ответ:

Yandex/yandexstation_2/yandexstation_2:9/PPR1.180610.011/20220415:user/release-keys

Последнее поле — номер сборки, и он у ревизий разный: на Станции Макс снят 5000000896. Важна часть PPR1.180610.011: утилита рассчитана на неё.

Если отпечаток сборки отличается — остановитесь. Параметры потребуется пересчитать под вашу версию по инструкции в репозитории проекта.

Также зафиксируйте текущие параметры окружения:

adb shell getprop ro.product.device      # yandexstation_2
adb shell uname -a                        # 4.9.113-g985a1e6b
adb shell id                              # uid=2000(shell)
adb shell getenforce                      # Enforcing

2. Подключение по ADB

Подключение выполняется стандартным способом:

adb connect <IP-колонки>:5555
adb devices          # статус: <IP-колонки>:5555    device
adb shell id         # uid=2000(shell)

Особенности среды: - Каталог /data/local/tmp доступен для записи (системный /tmp закрыт). - Системный журнал dmesg закрыт настройкой kernel.dmesg_restrict.

3. Сборка служебного модуля

Склонируйте исходный код утилиты и запустите сборку:

git clone https://github.com/amirilivice/yandex-station-2-s905x2-root
cd yandex-station-2-s905x2-root
python tools/build.py /path/to/android-ndk-r26d

Сборщик компилирует бинарный файл для архитектуры ARM.

Команда, которую нужно выполнить с системными правами, указывается при сборке:

python tools/build.py /path/to/ndk \
    --payload "id > /data/local/tmp/who.txt; getenforce >> /data/local/tmp/who.txt"

По умолчанию без флага --payload выполняется диагностическая команда: вывод идентификатора, проверка состояния защиты и возврат настроек в исходное состояние.

4. Запуск утилиты на устройстве

Запуск через автоматизированный скрипт:

python tools/build.py /path/to/android-ndk-r26d --device --serial <IP-колонки>:5555

Или вручную через консоль ADB:

adb push src/reader4 /data/local/tmp/app_tool
adb shell "chmod 755 /data/local/tmp/app_tool"
adb shell "rm -f /data/local/tmp/tool.log; \
  timeout 240 /data/local/tmp/app_tool > /data/local/tmp/tool.log 2>&1; \
  echo RUN_DONE; id; getenforce"

Правила запуска: 1. Перед запуском проверяйте uptime — устройство должно проработать после старта не менее трёх минут. 2. Не запускайте утилиту несколько раз подряд без перезагрузки системы.

5. Проверка работы

Проверьте лог выполнения:

adb shell cat /data/local/tmp/tool.log

При корректном выполнении в логе отобразится выполнение назначенной команды от имени администратора.

Особенности и ограничения

  • Действие в рамках одной команды: повышенные права предоставляются только для процесса, запущенного утилитой. После его завершения консоль остаётся в обычном режиме uid=2000(shell).
  • Защита накопителя: разделы /system и /vendor защищены проверками целостности dm-verity на уровне ядра и загрузчика. Запись на системные разделы не сохраняется.
  • Временный характер: все изменения происходят исключительно в оперативной памяти и не затрагивают постоянную прошивку.

Возврат в исходное состояние

Поскольку утилита не производит записи в системные разделы, обычная перезагрузка возвращает колонку в стандартный заводской режим:

adb shell reboot

После перезагрузки статус системы возвращается в штатное состояние:

adb shell getenforce          # Enforcing

Очистите временные файлы в каталоге:

adb shell rm -f /data/local/tmp/app_tool /data/local/tmp/tool.log

Подводные камни

  • Перед запуском проверяйте время непрерывной работы (uptime).
  • Не запускайте процедуру повторно без предварительной перезагрузки устройства.
  • Не используйте исполняемые файлы, собранные под другие версии ядра или устройства.

Отличия от DNS-метода

Параметр DNS-метод Метод Станции Макс
Модели Лайт, Мини, Миди, Станция 2 Станция Макс (YNDX-0008)
Платформа Buildroot / quasar Android 9 (YaOS_X)
Принцип Ответ облачной синхронизации Локальная сервисная утилита
Результат Сетевой ADB постоянно Выполнение команд в сессии ADB
Заводской сброс Требуется Не требуется
Изменение разделов Маркеры в /data/quasar Не производится
После перезагрузки Сохраняется Возврат в штатный режим