
BYD Dolphinのヘッドユニットをリバースエンジニアリング — CANバス、AVAS、NFCキー、OTAなど。DiLink 3 / Android 10。
BYD Dolphin 25/26 インフォテインメントシステム(DiLink 3、Android 10)のリバースエンジニアリング、ドキュメント、ツール。
ここにあるものはすべて ADB 探索、APK デコンパイル、CAN バスプロービングを通じて発見されたものであり、独自のドキュメントは一切使用していません。
⚠️ 免責事項: 非公式のコミュニティ主導プロジェクトであり、BYD とは一切関係ありません。 BYD の内部 Android サービスに対するリバースエンジニアリングは、教育および相互運用性の目的のみを意図しています。 自己責任で使用してください — 車両ソフトウェアを変更すると、保証が無効になったり、BYD の利用規約に違反する可能性があります。 著者は、車両、ソフトウェア、データへのいかなる損害についても責任を負いません。
| 項目 | 値 |
|---|---|
| プラットフォーム | DiLink 3.0 |
| Android | 10 (API 29) |
| SoC | Qualcomm QCM6125 (SM6125 Trinket) |
| アーキテクチャ | ARM64、8 コア |
| RAM | 約 3.5 GB |
| カーネル | 4.14.117-perf |
| ADB | WiFi、ポート 5555 |
| ヘッドユニット IP | 192.168.10.10 (車載 WiFi) |
| ファームウェア | 13.1.32.2507250.1 (2025年7月25日) |
| MCU | 13.5.2.2312260.1 |
| DSP | 13.5.5.2505300.2 |
| ブートローダー | アンロック済み (ro.boot.flash.locked=0) |
| 検証付きブート | Orange (アンロック) |
| インストルメントクラスター | 独立した Qt/QML システム (Qt 5.15.10 / 6.5.5) |
ファームウェア
13.1.32.2507250.1でテスト済み。 古いバージョンでもおそらく動作します。BYD からの新しいファームウェアアップデートにより、動作が変更または破損する可能性があります — 保証はありません。
初めての方へ サイドローディングガイド から始めて、root なしで BYD にアプリをインストールしましょう。
このリサーチに基づいて構築されたカスタムアプリについては、byd-apps を参照してください。
adb connect 192.168.10.10:5555
Third Party Apps XX フォルダ(国コードのサフィックス付き)に入れ、車に接続するBYD6125F(DiLink 3 全体で共通)targetSdk ≤ 33、minSdk ≤ 29ADB から CAN フレームを注入 — 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
UDS 診断プロトコル、CAN フレーム形式、ECU ネットワークトポロジの全体像については Driver Display を参照してください。
| 機能 | 詳細 |
|---|---|
| AC 温度読み取り | getTemprature(zone) — zone 1/2 = 設定温度、zone 4 = 外気/周囲温度 |
| AC 完全制御 | 40 以上の getter + SET メソッド(start/stop、温度、ファン、風モード)を権限バイパス経由で |
| AC リモートコントロール | hasFeature("ACRemoteControl") = 1、10〜30 分のタイマーに対応 |
| 権限バイパス | BydPermissionContext(ContextWrapper)がクライアント側で BYDAUTO_* 権限を自動付与 |
| CAN バス読み書き | ADB 経由で app_process + リフレクションを使用 |
| 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+ を受け入れる |
| setBuffer PCM ストリーミング | 128 バイトの PCM フレームが 8 以上の機能 ID で MCU に受理される(ret=0)。最大バッファ: 128 バイト。MCU が音声として解釈するかは未確認。 |
| AVAH テストトーン | 工場診断信号(0x6E970010)を使用して AVAS 外部スピーカーで再生 |
| AVAS メロディパターン | TEST_AUDIO_AVAS_SET ピッチ制御による 8 つの動作パターン(ドアベル、店舗チャイム、アラーム、ファンファーレなど) — Door Sound app |
| CAN バスインジェクション | VCDS スタイルの機能コーディングが可能 — com.byd.cluster.spi ブロードキャスト経由で CAN フレームを注入、root 不要 |
| クラスタスクリーンショット | fission_screencap -d 1 -p <file> でドライバーディスプレイをキャプチャ |
| インストルメントクラスタ読み取り | BYDAutoManager 経由で PowerUnit、TempUnit、BacklightCtlType、InsThemeValue |
| DRL トグル | setInt(1004, 0x43100046, 1/2) — DRL オートモード ON/OFF、読み戻しで確認済み |
| YUN デバイス (1034) | すべての 0xAA 機能 ID が MCU に受理される — setBuffer(1034, fid, data) と setInt(1034, fid, val) が 0(OK)を返す。cloudmanager のプライベート MCU チャネル。実行には AES 暗号化が必要。 |
| コンテンツプロバイダ | 車両データ(バッテリー、タイヤ空気圧、メンテナンス、トリップ消費)を公開 |
| サイドローディング | USB ドライブまたは ADB — ガイドを参照 |
| 360 カメラフレーム | 4 台のサラウンドカメラすべてからライブ 1280×960、root 不要。 bmmcamera.jar は world-readable — 自分でロードし、shell uid の app_process から JNIBMMCamera を直接駆動できる。インストール済みアプリではこれは絶対に不可能(SELinux が untrusted_app_* に bmmcameraserver binder を拒否する)が、ADB 経由で起動したプロセスなら可能 — 詳細 |
| 機能 | ステータス |
|---|---|
| ドアロックステータス | メインドアは INVALID (0) を返し、チャイルドロックは読み取り可能。専用の setDoorLockStatus() はなく、未知の機能 ID を指定した汎用 set() が必要 |
| 360 カメラ表示制御 | BYDAutoPanoramaDevice(モード、回転、透明度)はサーバー側で強制され、BydPermissionContext バイパスは失敗する。フレームキャプチャは動作する — 上記参照 |
| 機能 | 理由 |
|---|---|
| カスタム AVAS 音声アップロード | setBuffer は 128 バイトの PCM データを受け入れる(ret=0)が、MCU が音声として解釈しない可能性がある。外部スピーカールーティング(AUDIO_EXTERIOR_SPEAKER)は -10011 を返す(Dolphin では非対応)。完全な Boombox スタイルのカスタム音声は未確認 — AVAS リサーチ を参照。 |
| AVAS 音量制御 | MCU にハードコードされており、PROMPT_VOLUME_LEVEL は影響しない |
| クラスタテーマ/スキン変更 | AutoContainer サービスがシングル OS モード(fission_single_os=1)で「no AutoContainerNative」をスローする |
| クラスタデバッグコマンド | 昼夜、クラシック/テック、FPS、スキン — すべて AutoContainer が必要(ブロック) |
| BYDAutoInstrumentDevice API | BYDAUTO_INSTRUMENT_COMMON/SET 権限が必要 — shell UID 2000 はブロック |
| カスタムロック/電源オンサウンド | MCU ファームウェアがコマンドを拒否する |
| ホーン | ハードウェアリレーであり、ソフトウェア制御不可 |
| ハザードランプ点滅 | MCU GUID ゲート — MCU は SPI トランスポートを受け入れる(result=0)が、クラウド認証済み GUID が登録されていないリモートコントロールコマンドはサイレントに破棄する。MCU は setInt(1005, 0xAA00004A, 1) でオンライン化(mMCUStatus=1 確認済み)。フレーム形式は Ghidra で完全にデコード済み。最終的な障壁: GUID は cloudmanager プロセスメモリ(root)にのみ存在する。 |
| ブートアニメーション | 置き換えには root が必要(/system/media/) |
| 車内/室内温度 | API が見つからない — 網羅的なプロービングで利用不可を確認 |
| ブラウザ blob ダウンロードバイパス | fetch→blob→anchor.click はファームウェア 13.1.32.2507250.1 上の BYD の「Download proibido」ポリシーによりサイレントにブロックされる。ファイルは保存されず、エラーもポップアップも出ない。これが動作するという以前の主張は不正確だった — 完全な診断は test-log を参照。navigator.share もこのビルドでは undefined。 |
root はオプション — ほとんどの機能は root なしで動作する。Rooting Guide
| 機能 | 詳細 |
|---|---|
| 直接 SPI アクセス | /dev/spidev_ivi — 128 バイトの Java API 制限をバイパス(最大 247 バイトの SPI レコード) |
| ALSA ミキサーコントロール | tinymix 経由の AVAS 音声ルーティングの可能性 |
| MCU 設定リセット | MCU 状態をリセットする直接 SPI コマンド |
| システムパーティション書き込み | /system/media/(ブートアニメーション)の変更、システムアプリのインストール、cluster_theme*.rcc の置き換え |
| クラスタテーマ置き換え | /system/lib64/ 内の 132MB/124MB RCC ファイルを置き換え、libBydCluster.so のシングル OS チェックにパッチ |
| OBD 診断送信 | 完全な UDS コーディングのための BYDAUTO_OTA_SET + BYDAUTO_SETTING_COMMON 権限 |
| カーネルシンボル | /proc/kallsyms アクセス、dmesg |
| KernelSU | 実行不可 — GKI カーネル 5.10+ が必要だが、デバイスは 4.14.117(非 GKI)で動作 |
研究者向けのセキュリティ関連の主要な発見: