
Реверс-инжиниринг головного устройства BYD Dolphin — CAN-шина, AVAS, NFC-ключи, OTA и многое другое. DiLink 3 / Android 10.
Реверс-инжиниринг, документация и инструменты для информационно-развлекательной системы BYD Dolphin 25/26 (DiLink 3, Android 10).
Всё здесь было обнаружено путём исследования через ADB, декомпиляции APK и анализа CAN-шины — проприетарная документация не использовалась.
⚠️ Отказ от ответственности: Неофициальный проект, поддерживаемый сообществом — не связан с BYD. Реверс-инжиниринг внутренних Android-сервисов BYD выполняется исключительно в образовательных целях и для обеспечения совместимости. Используйте на свой страх и риск — модификация программного обеспечения автомобиля может привести к потере гарантии или нарушению условий обслуживания BYD. Авторы не несут ответственности за любой ущерб вашему автомобилю, программному обеспечению или данным.
| Свойство | Значение |
|---|---|
| Платформа | DiLink 3.0 |
| Android | 10 (API 29) |
| SoC | Qualcomm QCM6125 (SM6125 Trinket) |
| Архитектура | ARM64, 8 ядер |
| RAM | ~3.5 ГБ |
| Ядро | 4.14.117-perf |
| ADB | WiFi, порт 5555 |
| IP головного устройства | 192.168.10.10 (WiFi автомобиля) |
| Прошивка | 13.1.32.2507250.1 (25 июля 2025) |
| MCU | 13.5.2.2312260.1 |
| DSP | 13.5.5.2505300.2 |
| Загрузчик | Разблокирован (ro.boot.flash.locked=0) |
| Verified boot | Orange (разблокирован) |
| Приборная панель | Отдельная система Qt/QML (Qt 5.15.10 / 6.5.5) |
Протестировано на прошивке
13.1.32.2507250.1. Более старые версии, вероятно, тоже работают. Новые обновления прошивки от BYD могут что-то изменить или сломать — никаких гарантий.
Впервые здесь? Начните с Руководства по сайдлоадингу, чтобы установить приложения на ваш BYD — root не требуется.
О кастомных приложениях, созданных на основе этого исследования, см. byd-apps.
adb connect 192.168.10.10:5555
Third Party Apps XX (с суффиксом кода страны), подключите к автомобилюBYD6125F (универсальный для DiLink 3)targetSdk ≤ 33, minSdk ≤ 29Внедрение CAN-кадров из ADB — без root, без адаптера OBD2:
# 1. Start the ClusterDebug app + service (acts as privileged proxy)
adb shell "am start -n com.byd.clusterdebug/.MainActivity"
adb shell "am startservice -n com.byd.clusterdebug/.ClusterDebugService"
# 2. Inject CAN frames
adb shell "am broadcast -a com.byd.cluster.spi --es normal 'FF,FF,FF,FF,FF,FF,FF,FF'"
# 3. Capture cluster screenshot
adb shell "fission_screencap -d 1 -p /data/local/tmp/cluster.png"
adb pull /data/local/tmp/cluster.png
См. Driver Display для полного описания диагностического протокола UDS, формата CAN-кадров и топологии сети ECU.
| Функция | Детали |
|---|---|
| Чтение температуры кондиционера | getTemprature(zone) — зона 1/2 = заданная температура, зона 4 = наружная/окружающая |
| Полное управление кондиционером | 40+ getter- и SET-методов (старт/стоп, температура, вентилятор, режим обдува) через обход разрешений |
| Удалённое управление кондиционером | hasFeature("ACRemoteControl") = 1, поддерживает таймер 10–30 мин |
| Обход разрешений | BydPermissionContext (ContextWrapper) автоматически выдаёт разрешения BYDAUTO_* на стороне клиента |
| Чтение/запись CAN-шины | Через ADB с использованием app_process + reflection |
| 75+ пакетов BYD | С доступом к CAN-шине, 100+ пользовательских разрешений BYDAUTO_* |
| Звук симулятора двигателя | Симулятор присутствует и переключаем (HAS_SIMULATOR=2), пресет выбирается через 0x3E300038. MCU сохраняет и возвращает любой тип источника — проверено до 200; отклоняется только 0 — поэтому принятие не подразумевает отдельный звук, и количество реальных пресетов невозможно определить через этот API. 0x48F00013 возвращает 1, что означает «источник существует», а не количество. — Engine Sound app |
| Выбор пресета AVAS | Записывается через CAN — UI показывает 2, но MCU принимает 0–5+ |
| Потоковая передача PCM через setBuffer | 128-байтовые PCM-кадры принимаются MCU (ret=0) для 8+ feature ID. Максимальный буфер: 128 байт. Интерпретирует ли MCU их как аудио — не подтверждено. |
| Тестовые тоны AVAH | Воспроизводятся на внешнем динамике AVAS с использованием заводских диагностических сигналов (0x6E970010) |
| Мелодии AVAS | 8 рабочих шаблонов (дверной звонок, магазинный чайм, сигнализация, фанфары и т. д.) через управление высотой тона TEST_AUDIO_AVAS_SET — Door Sound app |
| Инъекция в CAN-шину | Возможно кодирование функций в стиле VCDS — инъекция CAN-кадров через широковещательную рассылку com.byd.cluster.spi, root не требуется |
| Скриншот кластера | Захват дисплея водителя через fission_screencap -d 1 -p <file> |
| Чтение данных приборной панели | PowerUnit, TempUnit, BacklightCtlType, InsThemeValue через BYDAutoManager |
| Переключение DRL | setInt(1004, 0x43100046, 1/2) — автоматический режим DRL ВКЛ/ВЫКЛ, подтверждено обратным чтением |
| Устройство YUN (1034) | ВСЕ feature ID 0xAA принимаются MCU — setBuffer(1034, fid, data) и setInt(1034, fid, val) возвращают 0 (OK). Приватный канал MCU от cloudmanager. Для активации требуется шифрование AES. |
| Content providers | Предоставляют данные автомобиля (батарея, давление в шинах, обслуживание, расход за поездку) |
| Sideloading | USB-накопитель или ADB — см. руководство |
| Кадры с 360-камер | Живое изображение 1280×960 со всех четырёх камер кругового обзора, без root. bmmcamera.jar доступен для чтения всем — загрузите его самостоятельно и управляйте JNIBMMCamera напрямую из app_process с uid shell. Установленное приложение никогда не сможет этого сделать (SELinux запрещает untrusted_app_* доступ к binder bmmcameraserver); процесс, запущенный через ADB, может — подробности |
| Функция | Статус |
|---|---|
| Статус блокировки дверей | Основные двери возвращают INVALID (0), детский замок читается. Нет выделенного setDoorLockStatus() — требуется универсальный set() с неизвестными feature ID |
| Управление отображением 360-камеры | BYDAutoPanoramaDevice (режим, поворот, прозрачность) контролируется на стороне сервера, и обход через BydPermissionContext не работает. Захват кадров работает — см. выше |