Geely Box. Купил, подключил, переписал интерфейс

Я являюсь гордым владельцем китайца от Geely. От авто я в восторге, но мультимедийная система вызывает вопросы. Например, в ней есть Apple CarPlay, но нет Android Auto. Для Android предлагается отдельное приложение, которое больше похоже на попытку зеркалить/транслировать экран телефона на дисплей автомобиля.

После использования такого софта хочется хорошо помыться и почистить зубы.

При этом я пользуюсь Android. С iOS у меня отношения не сложились, хотя переехать туда я пытался неоднократно. Каждый раз находились какие-то ограничения, с которыми не хотелось мириться, и я возвращался к Android. А после последних событий, когда установка некоторых нужных мне приложений на iPhone стала отдельной проблемой, желание снова пробовать окончательно пропало.
Но CarPlay от этого в машине не исчез. Поэтому пришлось держать отдельный iPhone Air исключительно для навигации и Яндекс Музыки. Не самое умное и удобное решение: перед поездкой нужно не забыть телефон дома, а потом забрать обратно (температура на улице, да и банальное отсутствие желания менять разбитое стекло в авто, если кому-то понравится этот айфон). И все это ради функций, которыми я спокойно пользуюсь на основном Android-смартфоне.

Пару недель назад мне попалась Geely Box (известен как G-Box, Geely AI Box и как-то еще). Небольшая коробка с Android, которая подключается к автомобилю через CarPlay и позволяет запускать привычные приложения. По описанию именно то, что нужно.

Осталось купить.

Предзаказ и предзаказ на предзаказ

Как гордый владелец китайского автомобиля, я пошел на официальный сайт Geely, нашел нужную коробку за 19 900 рублей и оформил предзаказ. Мне никто не перезвонил, поэтому через некоторое время я связался с официальным дилером, у которого покупал машину.
У дилера шайтан-коробки в наличии тоже не было. Зато был предзаказ с полной оплатой и ожиданием до трех недель. Правда, стоил он уже 27 200 рублей.
Я уточнил, почему на официальном сайте устройство стоит 19 900 рублей, а у официального дилера 27 200. Объяснения, помимо того, что цена именно такая, получить не удалось.

От предложения я отказался и позвонил на горячую линию Geely. Рассказал, что оставил предзаказ в их интернет-магазине, но со мной так никто и не связался. Тут выяснилось интересное: это вовсе не интернет-магазин, а «витрина».
Витрина с товарами, ценами, количеством и возможностью оформить заказ/предзаказ. Довольно необычная витрина, которую я, из-за своей жизненной неопытности, случайно перепутал с онлайн-магазином. Ну да ладно.

Не онлайн-магазинНе онлайн-магазин

Я поинтересовался, как это согласуется с понятием публичной оферты. Собеседник обсуждать эту тему не захотел и объяснил, что дилеры могут устанавливать собственные цены. Хоть 27 200 рублей, хоть 55 000.

Но звонил я не для того, чтобы спорить об офертах. Мне хотелось понять, где можно купить устройство. Ответ был простым: обзванивайте дилеров самостоятельно. Я обзвонил нескольких местных дилеров, но коробок нигде не оказалось.

В итоге новую Geely Box в упаковке я нашел на Авито за 12 500 рублей.
Вопросы к официальной продаже аксессуаров Geely у меня остались без ответа, зато появилась заветная коробка.

Geely BoxGeely Box

Android внутри Android

После подключения выяснилось, что внутри обычный Android 13 с некоторыми особенностями прошивки. Еще выяснилось, что коробка уже с рутом, но отключенным ADB. Приложения устанавливаются (любые), 2ГИС запускается, Яндекс Музыка работает. В принципе, можно было заканчивать на этом.

Но у штатного интерфейса есть свои особенности. И он не редактируется.

Очень удобно, особенно скорость по GPS хочу смотретьОчень удобно, особенно скорость по GPS хочу смотреть

Мне хотелось разместить карту, музыкальный плеер, время и погоду на одном экране, а основные кнопки управления вынести на постоянную боковую панель. Чтобы во время поездки не приходилось каждый раз открывать одно приложение, закрывать его и искать другое.

В какой-то момент решил попробовать сделать собственный интерфейс. Kotlin я изучаю больше года и уже использую его, поэтому язык был знаком. А вот с внутренним устройством «автомобильных» прошивок до этого настолько близко сталкиваться не приходилось.

Вспомнив молодость, прошивку телефонов, рут и вот это все, я собрался с мыслями.

Как засунуть 2ГИС в карточку

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

Я хотел видеть на главном экране полноценную карту 2ГИС (и любого навигатора/карт). Не скриншот, не трансляцию с телефона, не порезанный виджет от этого аппа, а само приложение, в котором можно двигать карту, искать адреса и строить маршруты.
По умолчанию Android устроен иначе: каждое приложение открывается в собственном окне. Если нужно другое, переключаешься на него. Просто вставить интерфейс одного приложения внутрь другого, как картинку в документ, стандартный Android SDK не позволяет.
Но в прошивке коробки нашелся TaskView. Это внутренний компонент Android, который умеет показывать другое приложение в выделенной области экрана. Причем само приложение продолжает работать как обычно, обрабатывает касания и управляет собственным интерфейсом.

Пришлось разобраться, как именно эта реализация устроена в прошивке Geely Box, и подготовить необходимые системные классы для компиляции. Обычному приложению из Google Play такие возможности недоступны.
После нескольких экспериментов 2ГИС заработал внутри главного экрана. Слева карта, справа музыкальный виджет и остальная информация. Все можно использовать одновременно.
Есть, правда, небольшой дефект: иногда после переключения приложений у карты появляется белая полоска слева. Если закрыть 2ГИС и открыть заново, она исчезает. Пока решил оставить как есть.

Панель, которая должна работать везде

Со второй частью интерфейса оказалось сложнее. Я хотел сделать боковую панель с кнопками Home, «Назад», нужных мне приложений и быстрого перехода к музыке. Причем панель должна оставаться на экране, даже если пользователь открыл 2ГИС или Яндекс Музыку на весь дисплей.
Сначала использовал AccessibilityService. Это механизм специальных возможностей Android, через который приложение может выполнять некоторые действия от имени пользователя. Работало, но требовало отдельно включать службу в настройках, а сама реализация зависела от ее состояния.
Поэтому начал изучать, как устроены системные панели Android. В результате удалось создать собственное окно типа NAVIGATION_BAR_PANEL через WindowManager. Если совсем просто, теперь Android воспринимает нашу панель не как обычное окно стороннего приложения, а как элемент системного интерфейса.

Для определения активного приложения используется TaskStackListener, а команды управления отправляются через InputManager.

Например, с кнопкой недавних приложений возникла проблема. Сначала попробовал обратиться к системному сервису Android, который должен был открывать обзор запущенных задач. Но на этой прошивке нужного метода не оказалось.

Тогда проверил простую команду:

adb shell input keyevent 187

Число 187 обозначает системное событие KEYCODE_APP_SWITCH. По сути, это команда открыть переключатель приложений. Она сработала, и осталось реализовать такую же отправку события из Geely Home.
После этого удалось полностью отказаться от AccessibilityService. Панель работает самостоятельно, понимает, какое приложение открыто, и восстанавливается после перезагрузки устройства. Правда, сначала пришлось исправить ситуацию, когда она исправно скрывалась при появлении системного окна, но обратно возвращаться не собиралась.
Здесь важно упомянуть особенность самой коробки. Прошивка использует известный тестовый сертификат AOSP, благодаря чему удалось подписать приложение для работы с системными привилегиями. На обычном Android-смартфоне такой трюк не повторить. Да и использование общедоступного ключа для системного ПО с точки зрения безопасности выглядит сомнительно.

Лайки/дизлайки

Я слышал невероятно огромное количество отзывов на новый интерфейс Яндекс.Музыки. Еще больше я слышал о качестве подборок и как приложение Яндекс.Музыки иногда превращается в симулятор нажатия кнопки дизлайка на треках.

Что нам нужно? Правильно. Вынести нужные для этого кнопки на карточку приложения.

Скрытый текст

Призываю всех не отвлекаться от дороги и быть аккуратными водителями!

Музыкальный виджет оказался заметно проще навигации и системной панели.
В Android существует MediaSession, через которую музыкальные приложения сообщают системе информацию о текущем треке и принимают команды управления. Именно поэтому, например, можно поставить музыку на паузу с беспроводных наушников, не открывая само приложение.
Geely Home подключается к активной медиасессии Яндекс Музыки и получает название трека, исполнителя, обложку и состояние воспроизведения. Через тот же механизм работают пауза, переключение композиций и перемотка.

Когда основной функционал был готов, захотелось добавить лайк и дизлайк. В самом приложении Яндекс Музыки они есть, но было непонятно, можно ли вызвать эти действия извне.
Я уже собирался извлекать APK и смотреть, что там происходит, но для начала решил проверить данные медиасессии:

adb shell dumpsys media_session

И обнаружил, что Яндекс Музыка сама предоставляет две дополнительные команды: «Нравится» и «Не нравится». Они публикуются как CustomAction, а значит, их можно вызвать через стандартный Android MediaController.

Добавил кнопки в виджет, подключил команды и проверил. Лайк действительно сохранился в Яндекс Музыке, значит и дизлайк работает, а не просто скипает треки. Никакой отдельной авторизации или неофициального API не потребовалось.

Была еще идея автоматически запускать музыку при включении коробки. Но выяснилось, что фоновый запуск приложения не гарантирует создание медиасессии. Попробовал вариант с кратковременным открытием Яндекс Музыки на экране, но быстро от него отказался. Смотреть, как при запуске машины приложение появляется без спроса, а потом исчезает, мне самому не понравилось.

Результат

Темная темаТемная темаСветлая темаСветлая тема

Сейчас у Geely Home есть две темы оформления, встроенная навигация, музыкальный виджет с управлением воспроизведением и лайками, погода, настройки компоновки и постоянная системная панель. Четыре приложения карт, с переключением, работают внутри TaskView, а для переключения приложений больше не требуется AccessibilityService.
Проект дошел до релиз-кандидата 1.0.0. Основные функции проверены на реальном устройстве, включая восстановление панели после перезагрузки. Длительное тестирование еще впереди, но пользоваться интерфейсом уже можно и это довольно приятно.

Изначальная задача была простой: избавиться от необходимости держать отдельный телефон в машине ради навигации и музыки. Geely Box с этим справилась, а заодно дала возможность немного поработать с той частью Android, с которой при обычной разработке приложений почти не сталкиваешься.

Теперь у меня есть интерфейс, который меня устраивает.

Технический стек

Для тех, кому интересны конкретные технологии и версии, собрал все в одном месте:

Скрытый текст

Приложение и интерфейс

  • Kotlin 2.3.21, Java 17

  • Jetpack Compose, Material 3, Compose BOM 2025.10.01

  • AndroidX Activity Compose 1.11.0

  • Android 13 на Geely AI Box

  • compileSdk 36, targetSdk 33, minSdk 28

  • SharedPreferences для настроек, Compose State и Kotlin Coroutines для работы с состоянием и асинхронными операциями

Интеграция с Android

  • WindowManager и NAVIGATION_BAR_PANEL для системной боковой панели

  • ActivityTaskManager и TaskStackListener для отслеживания активных приложений

  • InputManager для системных команд Back и Recents

  • OEM android.app.TaskView для встраивания навигации

  • MediaSessionManager и MediaController для управления музыкой, включая CustomAction для лайков и дизлайков

  • PackageManager для работы с установленными приложениями

Погода и данные

Прямые HTTPS-запросы к MET Norway Locationforecast API через HttpURLConnection. Координаты получаются через Android LocationManager, ответ обрабатывается средствами org.json. Отдельного сервера и собственной базы данных нет.

Разработка и сборка

  • Windows 11 Pro, WSL2, Ubuntu 24.04

  • Gradle 8.13, Android Gradle Plugin 8.13.2

  • Android SDK, JDK 17

  • ADB, Logcat, dumpsys и scrcpy для отладки на устройстве

  • Bash, PowerShell и Python для сборки, диагностики и проверок

Скрытые системные API компилируются с использованием собственных Java-заглушек, которые не попадают в итоговый APK. Для установки приложение подписывается совместимым с прошивкой тестовым платформенным ключом AOSP после проверки сертификата устройства.

Последнее существенно ограничивает воспроизводимость проекта. Это решение для конкретной Geely AI Box, а не универсальный APK, который можно установить на любой Android. Публично известный платформенный ключ также не подходит для безопасного распространения системного ПО.

Источник: habr.com

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев