
Rétro-ingénierie de l'unité centrale de la BYD Dolphin — bus CAN, AVAS, clés NFC, OTA, et plus encore. DiLink 3 / Android 10.
Rétro-ingénierie, documentation et outillage pour le système d'infodivertissement BYD Dolphin 25/26 (DiLink 3, Android 10).
Tout ce qui se trouve ici a été découvert via l'exploration ADB, la décompilation d'APK et le sondage du bus CAN — aucune documentation propriétaire n'a été utilisée.
⚠️ Avertissement : Projet non officiel, porté par la communauté — aucune affiliation avec BYD. Rétro-ingénierie des services Android internes de BYD à des fins éducatives et d'interopérabilité uniquement. À utiliser à vos propres risques — modifier le logiciel du véhicule peut annuler votre garantie ou violer les conditions d'utilisation de BYD. Les auteurs déclinent toute responsabilité pour tout dommage causé à votre véhicule, logiciel ou données.
| Propriété | Valeur |
|---|---|
| Plateforme | DiLink 3.0 |
| Android | 10 (API 29) |
| SoC | Qualcomm QCM6125 (SM6125 Trinket) |
| Architecture | ARM64, 8 cœurs |
| RAM | ~3.5 GB |
| Noyau | 4.14.117-perf |
| ADB | WiFi, port 5555 |
| IP de l'unité centrale | 192.168.10.10 (WiFi de la voiture) |
| Firmware | 13.1.32.2507250.1 (25 juil. 2025) |
| MCU | 13.5.2.2312260.1 |
| DSP | 13.5.5.2505300.2 |
| Bootloader | Déverrouillé (ro.boot.flash.locked=0) |
| Verified boot | Orange (déverrouillé) |
| Instrument Cluster | Système Qt/QML séparé (Qt 5.15.10 / 6.5.5) |
Testé sur le firmware
13.1.32.2507250.1. Les versions plus anciennes fonctionnent probablement. Les mises à jour firmware plus récentes de BYD peuvent modifier ou casser des choses — aucune garantie.
Nouveau ici ? Commencez par le Guide de sideloading pour installer des applications sur votre BYD — aucun root nécessaire.
Pour les applications personnalisées construites sur cette recherche, voir byd-apps.
adb connect 192.168.10.10:5555
Third Party Apps XX (suffixe du code pays), branchez dans la voitureBYD6125F (universel sur DiLink 3)targetSdk ≤ 33, minSdk ≤ 29Injectez des trames CAN depuis ADB — sans root, sans 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
Voir Driver Display pour le protocole de diagnostic UDS complet, le format des trames CAN et la topologie du réseau ECU.
| Fonctionnalité | Détails |
|---|---|
| Lecture de la température de climatisation | getTemprature(zone) — zone 1/2 = température réglée, zone 4 = extérieur/ambiante |
| Contrôle complet de la climatisation | Plus de 40 méthodes getter + SET (démarrage/arrêt, température, ventilation, mode de soufflage) via contournement des permissions |
| Contrôle à distance de la climatisation | hasFeature("ACRemoteControl") = 1, prend en charge une minuterie de 10 à 30 min |
| Contournement des permissions | BydPermissionContext (ContextWrapper) accorde automatiquement les permissions BYDAUTO_* côté client |
| Lecture/écriture du bus CAN | Via ADB en utilisant app_process + réflexion |
| Plus de 75 paquets BYD | Avec accès au bus CAN, plus de 100 permissions BYDAUTO_* personnalisées |
| Son du simulateur de moteur | Simulateur présent et commutable (HAS_SIMULATOR=2), préréglage sélectionné via 0x3E300038. Le MCU stocke et renvoie n'importe quel type de source — vérifié jusqu'à 200 ; seul 0 est rejeté — donc l'acceptation n'implique pas un son distinct et le nombre de préréglages réels n'est pas découvrable via cette API. 0x48F00013 renvoie 1 signifiant « une source existe », pas un nombre. — Engine Sound app |
| Sélection de préréglage AVAS | Inscriptible via CAN — l'interface affiche 2 mais le MCU accepte 0–5+ |
| Streaming PCM setBuffer | Trames PCM de 128 octets acceptées par le MCU (ret=0) pour plus de 8 ID de fonctionnalité. Tampon max : 128 octets. Interprétation audio par le MCU non confirmée. |
| Tonalités de test AVAH | Lecture sur le haut-parleur externe AVAS à l'aide de signaux de diagnostic d'usine (0x6E970010) |
| Motifs mélodiques AVAS | 8 motifs fonctionnels (sonnette, carillon de boutique, alarme, fanfare, etc.) via le contrôle de hauteur TEST_AUDIO_AVAS_SET — Door Sound app |
| Injection sur le bus CAN | Codage de fonctionnalités de style VCDS possible — injecter des trames CAN via la diffusion com.byd.cluster.spi, sans root |
| Capture d'écran du combiné | Capturer l'affichage conducteur via fission_screencap -d 1 -p <file> |
| Lectures du combiné d'instruments | PowerUnit, TempUnit, BacklightCtlType, InsThemeValue via BYDAutoManager |
| Bascule DRL | setInt(1004, 0x43100046, 1/2) — mode auto DRL ON/OFF, confirmé par relecture |
| Périphérique YUN (1034) | TOUS les ID de fonctionnalité 0xAA acceptés par le MCU — setBuffer(1034, fid, data) et setInt(1034, fid, val) renvoient 0 (OK). Canal MCU privé de Cloudmanager. Nécessite un chiffrement AES pour l'actionnement. |
| Fournisseurs de contenu | Exposent les données du véhicule (batterie, pression des pneus, entretien, consommation du trajet) |
| Installation en sideload | Clé USB ou ADB — voir le guide |
| Images de la caméra 360 | Flux live 1280×960 depuis les quatre caméras périphériques, sans root. bmmcamera.jar est lisible par tous — chargez-le vous-même et pilotez JNIBMMCamera directement depuis un app_process en uid shell. Une application installée ne pourra jamais le faire (SELinux refuse à untrusted_app_* le binder bmmcameraserver) ; un processus lancé via ADB le peut — détails |
| Fonctionnalité | Statut |
|---|---|
| État de verrouillage des portes | Les portes principales renvoient INVALID (0), le verrouillage enfant est lisible. Pas de setDoorLockStatus() dédié — nécessite un set() générique avec des ID de fonctionnalité inconnus |
| Contrôle d'affichage de la caméra 360 | BYDAutoPanoramaDevice (mode, rotation, transparence) est appliqué côté serveur et le contournement BydPermissionContext échoue. La capture d'images fonctionne — voir ci-dessus |