
Engenharia reversa da central multimídia do BYD Dolphin — barramento CAN, AVAS, chaves NFC, OTA e mais. DiLink 3 / Android 10.
Engenharia reversa, documentação e ferramentas para o sistema de infoentretenimento do BYD Dolphin 25/26 (DiLink 3, Android 10).
Tudo aqui foi descoberto através de exploração via ADB, descompilação de APK e sondagem do barramento CAN — nenhuma documentação proprietária foi utilizada.
⚠️ Aviso: Projeto não oficial, conduzido pela comunidade — sem qualquer afiliação com a BYD. Engenharia reversa dos serviços Android internos da BYD para fins exclusivamente educacionais e de interoperabilidade. Utilize por sua conta e risco — modificar o software do veículo pode anular a sua garantia ou violar os termos de serviço da BYD. Os autores não assumem qualquer responsabilidade por danos ao seu veículo, software ou dados.
| Propriedade | Valor |
|---|---|
| Plataforma | DiLink 3.0 |
| Android | 10 (API 29) |
| SoC | Qualcomm QCM6125 (SM6125 Trinket) |
| Arquitetura | ARM64, 8 núcleos |
| RAM | ~3.5 GB |
| Kernel | 4.14.117-perf |
| ADB | WiFi, porta 5555 |
| IP da Head Unit | 192.168.10.10 (WiFi do carro) |
| Firmware | 13.1.32.2507250.1 (25 de julho de 2025) |
| MCU | 13.5.2.2312260.1 |
| DSP | 13.5.5.2505300.2 |
| Bootloader | Desbloqueado (ro.boot.flash.locked=0) |
| Verified boot | Laranja (desbloqueado) |
| Painel de Instrumentos | Sistema Qt/QML separado (Qt 5.15.10 / 6.5.5) |
Testado no firmware
13.1.32.2507250.1. Versões mais antigas provavelmente funcionam. Atualizações de firmware mais recentes da BYD podem alterar ou quebrar o funcionamento — sem garantias.
Novo por aqui? Comece pelo Guia de Sideloading para instalar aplicações no seu BYD — sem necessidade de root.
Para aplicações personalizadas construídas com base nesta pesquisa, consulte byd-apps.
adb connect 192.168.10.10:5555
Third Party Apps XX (sufixo do código do país), conecte ao carroBYD6125F (universal em todo o DiLink 3)targetSdk ≤ 33, minSdk ≤ 29Injete frames CAN a partir do ADB — sem root, sem dongle 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
Consulte Driver Display para o protocolo de diagnóstico UDS completo, formato de frame CAN e topologia de rede da ECU.
| Recurso | Detalhes |
|---|---|
| Leitura de temperatura do AC | getTemprature(zone) — zona 1/2 = temperatura definida, zona 4 = externa/ambiente |
| Controle total do AC | Mais de 40 métodos getter + SET (iniciar/parar, temperatura, ventilador, modo de vento) via bypass de permissão |
| Controle remoto do AC | hasFeature("ACRemoteControl") = 1, suporta timer de 10–30min |
| Bypass de permissão | BydPermissionContext (ContextWrapper) concede automaticamente permissões BYDAUTO_* no lado do cliente |
| Leitura/escrita no barramento CAN | Via ADB usando app_process + reflection |
| Mais de 75 pacotes BYD | Com acesso ao barramento CAN, mais de 100 permissões BYDAUTO_* personalizadas |
| Som do simulador de motor | Simulador presente e alternável (HAS_SIMULATOR=2), preset selecionado via 0x3E300038. A MCU armazena e devolve qualquer tipo de fonte — verificado até 200; apenas 0 é rejeitado — portanto a aceitação não implica um som distinto e o número de presets reais não é descobrível através desta API. 0x48F00013 retorna 1 significando "existe uma fonte", não uma contagem. — Engine Sound app |
| Seleção de preset AVAS | Gravável via CAN — a UI mostra 2 mas a MCU aceita 0–5+ |
| Streaming PCM via setBuffer | Frames PCM de 128 bytes aceitos pela MCU (ret=0) para mais de 8 feature IDs. Buffer máximo: 128 bytes. Se a MCU interpreta como áudio não confirmado. |
| Tons de teste AVAH | Reproduzidos no alto-falante externo AVAS usando sinais de diagnóstico de fábrica (0x6E970010) |
| Padrões de melodia AVAS | 8 padrões funcionais (campainha, som de loja, alarme, fanfarra, etc.) via controle de tom TEST_AUDIO_AVAS_SET — Door Sound app |
| Injeção no barramento CAN | Codificação de recursos estilo VCDS possível — injetar frames CAN via broadcast com.byd.cluster.spi, sem necessidade de root |
| Captura de tela do cluster | Capturar o display do motorista via fission_screencap -d 1 -p <file> |
| Leituras do painel de instrumentos | PowerUnit, TempUnit, BacklightCtlType, InsThemeValue via BYDAutoManager |
| Alternância de DRL | setInt(1004, 0x43100046, 1/2) — modo automático de DRL ON/OFF, confirmado por leitura de retorno |
| Dispositivo YUN (1034) | TODOS os feature IDs 0xAA aceitos pela MCU — setBuffer(1034, fid, data) e setInt(1034, fid, val) retornam 0 (OK). Canal MCU privado do Cloudmanager. Requer criptografia AES para atuação. |
| Content providers | Expõem dados do veículo (bateria, pressão dos pneus, manutenção, consumo de viagem) |
| Sideloading | Pen drive USB ou ADB — ver guia |
| Frames da câmera 360 | Ao vivo 1280×960 das quatro câmeras surround, sem root. bmmcamera.jar é legível por todos — carregue-o você mesmo e controle JNIBMMCamera diretamente de um app_process com uid shell. Um app instalado nunca consegue fazer isso (o SELinux nega a untrusted_app_* o binder bmmcameraserver); um processo iniciado via ADB consegue — detalhes |
| Recurso | Status |
|---|---|
| Status da trava das portas | Portas principais retornam INVALID (0), trava infantil legível. Sem setDoorLockStatus() dedicado — precisa de set() genérico com feature IDs desconhecidos |
| Controle de exibição da câmera 360 | BYDAutoPanoramaDevice (modo, rotação, transparência) é aplicado no lado do servidor e o bypass do BydPermissionContext falha. A captura de frames funciona — ver acima |