Disclaimer: This is an unofficial, community-driven project with no affiliation, endorsement, or sponsorship from BYD or any of its subsidiaries. It involves reverse engineering of BYD's internal Android services for educational and interoperability purposes only. Use at your own risk — modifying vehicle software may void your warranty or violate BYD's terms of service. The authors assume no liability for any damage to your vehicle, software, or data.
Open-source Android apps for BYD electric vehicles.
Built on reverse-engineered BYD APIs — these apps interact directly with the vehicle's CAN bus through BYD's internal Android services. Not available on Google Play.
| App | Description | Download |
|---|---|---|
| Door Sound | Custom interior sounds on door, hood, trunk, lock/unlock, alarm and window events; AVAS tone patterns on the exterior speaker; parked-watch window and deep-sleep diagnostics | door-sound.apk |
| Engine Sound | Select the vehicle's built-in engine voice simulator presets (readback-verified; which speaker the MCU routes them to is unverified) | engine-sound.apk |
| Cabin | Keep pets safe — AC monitoring, temperature display, always-on screen, plus a high-contrast Outside view readable through tinted glass | pet-mode.apk |
| BYD Probe | Diagnostic tool — enumerates all BYD Auto API methods via reflection | byd-probe.apk |
All versions are on the releases page. You do not need to build anything — download the APK and install it.
Quick start: copy the APK to Third Party Apps <countryCode>/ on a USB stick (55 Brazil, 52 Mexico, 91 India …; the suffix is your car's sys.byd.countrycode) → plug in → password BYD6125F (130820 in India).
Signing keys. Releases before September 2026 each used a throwaway key. Door Sound 1.3.0 changes the key once more — the 1.2.0 key is no longer available — so upgrading from 1.2.0 needs an uninstall first and loses the selected sound files and per-event settings. From 1.3.0 on the key is stable (
67397b8ca97a25fa0de930c9c08e0e4a05fcf2b3a0f4e810146dd8ac34a6db32) and upgrades install over the top. Engine Sound, Cabin and BYD Probe still carry their earlier key; their next release will need the same one-time uninstall.
| Property | Value |
|---|---|
| Vehicles | BYD Dolphin 25/26 (likely works on other DiLink 3 models) |
| Known incompatible | DiLink 5 — see #3 |
| Platform | DiLink 3.0 (global version) |
| Android | 10 (API 29) |
| Architecture | ARM64 (Qualcomm QCM6125) |
| Tested Firmware | 13.1.32.2507250.1 (Jul 25 2025) |
Tested on firmware 13.1.32.2507250.1. Older versions likely work. Newer firmware updates from BYD may change or break things — no guarantees.
No root required. Two methods:
- Create a folder named
Third Party Apps <countryCode>on a USB drive, where<countryCode>is your car'ssys.byd.countrycode(55Brazil,52Mexico,62Indonesia,66Thailand,91India,966Saudi Arabia,971UAE,997Kazakhstan,998Uzbekistan). Europe, Australia and Japan units useApplication Installation <countryCode>with no password instead. - Copy the APK into that folder
- Plug USB into the car
- Enter password:
BYD6125F(India uses130820) - Tap the APK to install
Requires enabling USB debugging first — see the full Sideloading Guide.
adb connect 192.168.10.10:5555
adb install build/door-sound.apkA recurring question (#4): a custom audio file cannot be routed to the exterior AVAS speaker on this platform. If you lock the car and walk away, your own audio file will never be what you hear from outside.
Measured on a Dolphin:
- the AVAS custom-source feature ids
0x35201036and0x35201040both return-10011; 0x1C10000E,0x32B1C042and0x1B100043are not accepted at all;- the AVAS sounds live in MCU flash and are not reachable from Android;
setBuffercaps at 128 bytes, roughly 8 ms of 8 kHz audio.
So there are exactly two audio routes:
| Route | What can play | Used by |
|---|---|---|
| Interior speakers | any audio file you choose | Door Sound, "Inside speaker" tab |
| Exterior AVAS speaker | the vehicle's own two tones (0xAA000104) and its built-in engine presets |
Door Sound "Outside speaker" tab, Engine Sound |
Note also that a successful setInt proves nothing on this platform — it returns success even for
values the MCU ignores. Every write in these apps is read back and verified.
# one-time: fetch android.jar for API 29
mkdir -p "$HOME/.local/share/android/platform-29"
curl -fsSL -o /tmp/platform-29.zip \
https://dl.google.com/android/repository/platform-29_r05.zip
unzip -oj /tmp/platform-29.zip android-10/android.jar \
-d "$HOME/.local/share/android/platform-29"
# then, per app
cd apps/door-sound && ./build.shAll four apps share apps/common/build-common.sh, the BYD API stubs in apps/common/stubs/ and
apps/common/libs/byd_sdk.dex. Each app's build.sh only sets its output name and package.
Requirements:
- JDK 11+
- Android SDK build-tools (
aapt2,d8,apksigner,zipalign) android.jarfor API 29 (the command above, or setANDROID_JAR)
Signing uses one repo-wide keystore at keystore/byd-apps.keystore, generated on first build and
gitignored. It lives outside build/ on purpose: when the key was regenerated per build, every
reinstall was a signature mismatch and in-place upgrades were impossible.
Toolchain limit:
d88.2.2 cannot dex Java enums or anonymous inner classes — both fail withNullPointerException: Cannot invoke "String.length()". Usethis::methodreferences and final classes of static constants instead. Details inapps/common/build-common.sh.
tools/emu.sh runs the apps on an AVD with the head unit's geometry (1920x1080 at 240dpi,
landscape, the car's [0,84][1920,990] stable frame) and an emulator-only fake vehicle
(apps/common/fake/) in place of the BYD SDK, so layout, states and copy can be iterated without
powering the car on:
tools/emu.sh setup # one-time: SDK, API 29 image, "dilink3" AVD
tools/emu.sh start
tools/emu.sh install pet-mode # BYD_FAKE=1 build, install, launch
tools/emu.sh vehicle lock=1 ac=0 # drive the fake vehicle (run bare for all keys)
tools/emu.sh shot /tmp/cabin.pngThe fake answers instantly and never fails a write, so it proves nothing about CAN timing, readback
or MCU behaviour — those stay car-only. Fake builds are written to build/fake-*.apk, their
versionName ends in +fake, and the fake throws on real hardware; never install one on a car.
Detailed API reference in research/byd-auto-api-reference.md — covers AC, door lock, panorama, bodywork, and cloud communication APIs with live-verified values.
These apps are based on findings from the byd-dolphin-hacking research repo — CAN bus protocol documentation, BYD API reverse engineering, and audio architecture analysis.
Every modification, finding, discovery, or change made to the BYD Dolphin must be committed and pushed. See CLAUDE.md.
- App killed after minutes, or dead after a reboot? → Settings → Apps → Auto-start Management.
That screen is a block list and its switches read backwards: a row switched ON means
auto-start is disabled for that app, OFF means it is allowed. Measured on a DiLink 3 unit:
with the row ON a background app never received
BOOT_COMPLETEDat all. The list is keyed by the APK directory, so re-check it after every install and every upgrade — Door Sound marks its BYD auto-start pill amber until you have. - Nothing happens when you lock the car minutes after switching it off? → switching the car off does not reboot the head unit, it lets the SoC suspend. Door Sound keeps a wake lock and a 10-second poll alive for the Watch parked duration (10 min by default; 30/60/always in the tab row), and its Diagnostics screen prints the suspend gaps it saw.
- Temperature shows "--"? → either the AC signals are unavailable on your firmware, or the climate feed went stale: Cabin withdraws readings older than 120 s rather than leaving a stale number on screen, and shows "Climate signal lost" when it does.
- Door Sound logs the event but plays nothing? → playback needs the master switch and that event's own switch and a selected file. Each card states which one is missing. Note that Preview deliberately bypasses the switches.
- Engine Sound shows 20 presets but only one or two make a sound? → expected. The MCU stores and echoes back any preset number you write (verified up to 200 on a Dolphin), so the vehicle cannot be asked how many sounds it actually has. The app offers a fixed range of 20 and lets you rename the ones you can hear — long-press a preset chip to name it.
- New firmware broke things? → Report in issues; no guarantees on updates.
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.