Repository navigation
Releases: wheregoes/byd-apps
Release list
Door Sound 1.3.0 — parked watch window + deep-sleep diagnostics
Door Sound 1.3.0 — for the "nothing happens when the car is off" reports
(#6, #5).
⚠️ This one upgrade needs an uninstall first. The signing key had to be replaced, so Android
treats 1.3.0 as a different app: uninstall Door Sound 1.2.0, then install this APK. Your selected
sound files and per-event settings are lost and have to be chosen again — sorry. Upgrades after
this one are in place again.
Signing certificate SHA-256:67397b8ca97a25fa0de930c9c08e0e4a05fcf2b3a0f4e810146dd8ac34a6db32
Why this release exists
Switching the car off does not reboot the head unit — measured on a DiLink 3 unit that reached 72
days of uptime across many drives. The SoC suspends instead. So the service was never being killed by
power-off; what ended was its fixed 10-minute watch window, after which only a pushed CAN callback
could still reach it.
What is new
- Watch parked — a pill in the tab row, tap to cycle 10 min / 30 min / 60 min / always. It
sets how long the 10-second lock poll and the wake lock stay alive after the car powers down.
Default stays 10 minutes: an always-open window keeps the SoC out of suspend and draws from the
12 V battery. Changing it takes effect immediately. - Diagnostics tells the three failure modes apart.
elapsedRealtime()counts suspended time and
uptimeMillis()does not, so a divergence across one poll interval is a suspend and nothing else:park watch: 10 min after a power change watch: open, 7m12s left deep sleep: 3 gaps, longest 41m08s autostart screen: present, NOT yet checked for this installservice: STOPPEDis a killed service;RUNNINGwith a stalelast polland a closed window is a
frozen one; anEVENT:line with noplaying …is the hardware path. - BYD auto-start button that opens
com.byd.appstartmanagementdirectly, marked amber with
— checkuntil it has been opened once for the installed version.
Documentation correction worth reading
BYD's auto-start screen is a block list and its switches read backwards: a row shown 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_COMPLETED at all — receiver registered at
priority 9900, package not stopped, nothing crashed, the broadcast simply never arrived. Both READMEs
previously said to "enable" it. The list is also keyed by the APK directory, so it has to be
re-checked after every install and every upgrade — including this one.
Internals
Window and poll bookkeeping moved from the wall clock to elapsedRealtime(); the wake lock is
re-acquired (always with a timeout) on every poll so a long window cannot outlive a kill;
onStartCommand re-arms the window. New shared com.wheregoes.byd.AutoStart.
Door Sound v1.2.0
Door Sound v1.2.0
Custom sounds for door, hood, trunk, lock/unlock, alarm and window events.
This release is about the two reports that the sounds work while the app is open and stop once the
car is parked and the app is closed (#4,
#5), and about being able to diagnose that from
the head unit itself.
Fixed
- Lock and unlock never fired on some vehicles. The service acted only on the pushed
onAutoSystemStateChangedcallback and never re-read the lock state, so a car that reports its
lock state but does not announce it produced no lock or unlock sound at all — on any model, with
door events working normally the whole time. Our Cabin app has always polled
(VehicleStateMonitor.pollState); this app never did. It now re-readsgetAutoSystemState()and
getPowerLevel()every 10 s and feeds the same edge-tracked handler, so the chime arrives within
10 s on a car that stays quiet, still fires instantly on a car that pushes the event, and cannot
fire twice. - The CPU wake lock was dropped exactly when you park.
BODYWORK_POWER_LEVEL_OFFreleased it,
which is the moment before you lock the car and walk away — the one event people wanted a sound
for. Parking now re-arms a bounded 10-minute watch window instead of ending it. The lock is still
acquired with a timeout and released explicitly when the window closes, so a killed service cannot
pin the CPU awake. - An in-place update left the app silent until someone opened it.
BootReceivernow also
handlesMY_PACKAGE_REPLACED, so installing a new APK over the old one restarts the service by
itself when the master switch is on. - All vehicle reads moved onto one serialised I/O thread —
getPowerLevel()used to run on the main
looper — and the lock edge check is now synchronised, because the pushed callback and the poll can
reach it at the same time.
Added — Diagnostics, for owners with no PC
Every diagnostic we have asked for in these threads (adb logcat, adb shell cat …) assumed a
computer. At least one reporter installs APKs from the head unit with an APK-installer app and owns
no PC, which made all of it unusable. There is now a Diagnostics button in the header, next to
the Enabled switch. A photo of that screen answers the same questions:
Door Sound 1.2.0 (code 3)
android: 29 model: BYD AUTO hw: qcom
locale: pt_BR
service: RUNNING since 12:45:10
listener: registered
avas: available
lock raw: 2 (locked)
power: 0 (off)
last poll: 12:46:10
master switch: on
last event: Porta dianteira esquerda fechada @ 15:53:56
--- decision log, last 40 lines ---
…
That block is English on every car on purpose, so a screenshot reads the same whatever language the
vehicle is set to; only the screen's title and Refresh button are translated. service: STOPPED or
repeated === Service onCreate START === lines in the log are the answer to "is the head unit
killing it", and a gap with no poll: lines around the time you locked the car is the answer to
"was it alive at all".
Installing
Copy the APK to Third Party Apps 55/ on a USB stick, plug it into the car, password BYD6125F —
or install it with any APK installer on the head unit, or adb install -r door-sound.apk over WiFi.
This one upgrades in place. No uninstall, and your settings are kept. The signing key has been
stable since v1.1.0, so Android accepts it over the top. (Releases before v1.1.0 each used a
regenerated key; if you are still on v1.0.0 you do need to remove it first.)
Signed with v1 + v2 + v3 schemes.
Verified on
A BYD Dolphin, parked with the car off: poll: lock raw=2 power=0 in the log, one bounded
doorsound:service wake lock in dumpsys power, and the Diagnostics screen above read straight
off the head unit. The poll path itself was proven against a vehicle that changes its lock state
without announcing it, which is the case no previous build could handle.
Engine Sound v1.1.0
Engine Sound v1.1.0
Select AVAS engine sound presets on the exterior speaker (BYD's Boombox).
This release answers a report in #5: changing the
preset plays something for a moment, then the sound "goes back to normal".
Fixed
- The app claimed the sound was ON after the vehicle had already turned it off. The status line
was rendered from a cached flag, so a car that stores the preset and then drops
STATE 0x48F0000Aback to 0 — which is exactly what a momentary sound followed by silence looks
like — still showed a green sound ON. The state register is now re-read after every preset
write, and the app says "Vehicle turned the engine sound off again — preset N kept" and
switches the toggle off to match. - Turning the sound off read the state register back without waiting for the MCU to answer, so a
switch-off that worked could report that the vehicle did not confirm it.
Added — the four registers, on screen
The only way per-model differences in this API get established is someone reading the raw values off
their own car, and until now that needed adb. The main screen now carries them:
SIM 0x48F00000 = 2
SRC 0x48F00013 = 1
STATE 0x48F0000A = 0
TYPE 0x48F00010 = 1
write 0x3E300038 = 5 -> read 5
SIM is whether the vehicle has an engine voice simulator (2 = yes), SRC whether a voice source
exists, STATE whether the simulator is currently on, TYPE the preset the MCU is actually
holding. The last line is the most recent write and what the readback returned — a write that the
car ignored is visible here even when everything else looks fine. Tap the panel to re-read all four.
One photo of that panel says more about a vehicle than any description of the symptom can, and it
needs no computer.
Installing
Copy the APK to Third Party Apps 55/ on a USB stick, plug it into the car, password BYD6125F —
or install it with any APK installer on the head unit, or adb install -r engine-sound.apk over
WiFi.
This one upgrades in place. No uninstall, and your preset names are kept. The signing key has
been stable since v1.0.0, so Android accepts it over the top.
Signed with v1 + v2 + v3 schemes.
Still true from v1.0.0
The car accepts any preset number and stores it — verified to 200 on a Dolphin, with only 0
rejected — so the number of presets that produce a distinct sound is not discoverable through this
API. Listen, then long-press a preset to name the ones you can hear.
Cabin v3.1.0
Cabin v3.1.0 — Outside view
Keeps pets safe: monitors the AC, shows the cabin temperature, keeps the screen on.
New — Outside view
A black-and-white high-contrast display designed to be read from outside the car, through tinted
window film, at about two metres.
- Engages by itself when you lock the car, and returns to the normal view when you unlock
- Measured 21:1 contrast, with the temperature filling ~40% of the screen height
sans-serif-blackat the heaviest weight available, no gradients or glass behind the text —
thin fonts and decorative backgrounds are the first things tint film destroys- Set it to Auto, Always on, or Off under Settings → Display
- Touch it to go back to the normal view for a minute
Fixed
- The AC indicator flapped. Two independent code paths wrote the same flag with no precedence,
so a 30-second poll periodically overwrote the event-driven value. Climate monitoring is now the
single authority. - Stale climate data was shown as live — a genuine hazard in a pet-safety app. A reading older
than 120 s is now withdrawn and replaced with "Climate signal lost". - The 12V reading overwrote the traction battery percentage. Two unrelated quantities shared one
field; they are now separate. - The screen brightness was never restored. The app captured the brightness mode but not the
level, leaving the car's display pinned at maximum after you left the app. - The reassurance message was capped at 400dp — 31% of the screen width — which is why it rendered
small. It now scales to fill the space in every language. - Vehicle polling moved off the UI thread; wake lock given a timeout and released on power-off;
the one-minute restarter replaced with a proper periodic job.
Changed
versionNamenow matches the release. The APK published as "Cabin v3.0.0" actually reported
2.1.2internally, because the manifest was never bumped.- Dropped two permissions the code never used (
WRITE_EXTERNAL_STORAGE,BYDAUTO_PM2P5_GET). - Interior polish: glass panels, specular highlight on the avatar, elevation and colour tokens
instead of hardcoded values.
Installing
Copy the APK to Third Party Apps 55/ on a USB stick, plug it into the car, password BYD6125F —
or adb install -r <file>.apk over WiFi.
Upgrading from an older release requires adb uninstall first (or remove the app on the car).
Every previous release was signed with a throwaway key that the build script regenerated each time,
so Android sees them as different apps and refuses to upgrade in place. That is fixed: from this
release on the signing key is stable, and upgrades install over the top keeping your settings.
Signed with v1 + v2 + v3 schemes, certificate SHA-256 7ef5cb43b150…, the same for all four apps.
Door Sound v1.1.0
Door Sound v1.1.0
Custom sounds for door, hood, trunk, lock/unlock, alarm and window events.
Fixed
- Lock detection missed most locks (#4). The
code testedstate == 1, but the vehicle reports a three-state machine and a fob lock often lands
onSTART_SECURE(2). Now any state at or aboveSET_SECUREcounts as locked, tracked on the
transition so one physical lock fires exactly one sound. - The silent-configuration trap (#5). The
event log updated on every door event while playback quietly required three separate switches,
so the app looked configured and working when nothing could ever play. Each card now states in
amber exactly what is missing — "Will not play: Enabled is off", "no file selected" — and
choosing a file switches that event on by itself. - Music volume is no longer hijacked. Sounds used to save, overwrite and restore the global
media volume, which left the radio changed if the process died mid-playback. Now uses
per-player gain withUSAGE_ASSISTANCE_SONIFICATION. - Diagnostics that actually exist. 21 log calls wrote to
/sdcard/Download, which API 29
denies, so the file was never created. Logs now go to logcat and to
Android/data/com.wheregoes.doorsound/files/doorsound-log.txt, and record why a sound was
skipped, not just that an event happened. - Wake lock now has a timeout and is released when the car powers off — an untimed lock pinned the
CPU until reboot if the service was killed. - The restarter job was re-arming a one-minute deadline forever; now a proper 15-minute periodic job.
- Listener registration retries with backoff instead of giving up, so starting at boot no longer
races the vehicle service and leaves the app permanently deaf. - Fixed an Activity leak: the status refresher re-posted itself to a different
Handlerthan the
one that cancelled it.
Added
- Hood, trunk, alarm and window-left-open events — the old build filtered doors 1–4 and
discarded hood (5) and trunk (6) entirely - Rebuilt on Cabin's design system: all eight event cards visible at once with no scrolling
(previously "Lock" was cut off below the fold) - Portuguese, Spanish, French and Chinese translations
Installing
Copy the APK to Third Party Apps 55/ on a USB stick, plug it into the car, password BYD6125F —
or adb install -r <file>.apk over WiFi.
Upgrading from an older release requires adb uninstall first (or remove the app on the car).
Every previous release was signed with a throwaway key that the build script regenerated each time,
so Android sees them as different apps and refuses to upgrade in place. That is fixed: from this
release on the signing key is stable, and upgrades install over the top keeping your settings.
Signed with v1 + v2 + v3 schemes, certificate SHA-256 7ef5cb43b150…, the same for all four apps.
BYD Probe v1.0.0
BYD Probe v1.0.0 — first release
Diagnostic tool. Enumerates BYD's Auto API through reflection and prints what your vehicle exposes —
useful for reporting what works on a model other than a Dolphin.
Never released before; it existed only as source.
What it does
- Lists every BYD Auto device class and method signature available on your head unit
- Reads vehicle state (doors, power, lock, battery, climate) and prints raw values
- Writes its output to logcat under
BYD_PROBEand to a file in its own external data directory
Safety
Enumeration is read-only. The three AC actions genuinely change vehicle state, so each is labelled
with a warning and asks for confirmation naming the effect before it runs.
Reflection failures are caught as Throwable, not Exception — a missing BYD class raises
NoClassDefFoundError, which previously aborted the whole probe instead of logging one gap.
If you are reporting a compatibility issue, the output of this app is the most useful thing you can
attach.
Installing
Copy the APK to Third Party Apps 55/ on a USB stick, plug it into the car, password BYD6125F —
or adb install -r <file>.apk over WiFi.
Upgrading from an older release requires adb uninstall first (or remove the app on the car).
Every previous release was signed with a throwaway key that the build script regenerated each time,
so Android sees them as different apps and refuses to upgrade in place. That is fixed: from this
release on the signing key is stable, and upgrades install over the top keeping your settings.
Signed with v1 + v2 + v3 schemes, certificate SHA-256 7ef5cb43b150…, the same for all four apps.
Engine Sound v1.0.0
Engine Sound v1.0.0 — first release
Selects the AVAS engine-sound preset your car plays through its exterior speaker (BYD's "Boombox").
This app has never been released before. It existed only as source, which is why it could not be
found on the releases page (#5).
What it does
- Turns the engine-voice simulator on and off, and verifies the vehicle actually accepted it
rather than assuming the write worked - 20 preset chips — tap one directly instead of pressing NEXT ten times
- Long-press a chip to rename it, so you can label the presets your car really plays
- Auto-cycle through presets to hear what your vehicle has
- One status line that always reflects the current vehicle state
Why the honesty matters
The MCU accepts and echoes back any preset number — verified up to 200 on a Dolphin. So the car
cannot be asked how many sounds it has, and any app claiming to detect the count is reporting its
own loop bound. This app offers a fixed range of 20 and lets you name the ones you can hear.
If your vehicle rejects a preset, the status line says so and shows the value the car fell back to.
Fixed in this first release
- All vehicle I/O serialised onto one thread — concurrent writes used to land out of order and
make the preset number appear to jump or revert - Rapid taps coalesced into a single CAN write, so four taps move exactly four presets
- A 120 ms settle delay before every readback. The MCU does not answer a read issued immediately
after a write; without this the app reported "vehicle did not confirm sound ON" on a working car - Every
Toastremoved. The queue ran ~4 s behind and painted stale values over current ones —
this was the reported "value keeps reverting" bug, and it was never the vehicle - Real XML layout with proper touch targets (the UI was built in code with raw pixel sizes, which is
why the buttons rendered as small squares) - Portuguese, Spanish, French and Chinese translations
Installing
Copy the APK to Third Party Apps 55/ on a USB stick, plug it into the car, password BYD6125F —
or adb install -r <file>.apk over WiFi.
Upgrading from an older release requires adb uninstall first (or remove the app on the car).
Every previous release was signed with a throwaway key that the build script regenerated each time,
so Android sees them as different apps and refuses to upgrade in place. That is fixed: from this
release on the signing key is stable, and upgrades install over the top keeping your settings.
Signed with v1 + v2 + v3 schemes, certificate SHA-256 7ef5cb43b150…, the same for all four apps.
Cabin v3.0.0
Cabin v3.0.0 — Rebrand
Pet Mode is now Cabin. New name, new icon, same app.
Changes
- New app name — "Cabin" across launcher, notifications, settings, and exit dialog
- New launcher icon — Aurora paw from the Cabin design system (replaces old flat vector)
- All 6 locales updated — English, Português (BR), Português (PT), Español, Français, 中文
Install
adb install pet-mode.apk
After install, re-enable auto-start:
Settings > Apps > Auto-start Management > Cabin
Pet Mode v2.1.2
Pet Mode v2.1.2 — Visual Polish
Changes
- Alert overlap fixed — AC-off (red) and door-open (amber) alerts now stack vertically when both active
- Avatar disc removed — pet images float directly without the glass circle
- Bolder temperature — font changed from thin to light weight, size 280→320sp
- Larger text — reassurance message 56→64sp, sub-text 26→30sp
- AC status more visible — indicator opacity 45%→70%
Install
adb install pet-mode.apk
Pet Mode v2.1.1
Pet Mode v2.1.1 — Bug Fixes & UX Polish
Fixes
- "Meu dono volta logo" — changed "motorista" (driver) to "dono" (owner) across all 6 locales
- Timer format — "Ativo por 00h 02min" instead of cryptic "Ativo 0:02"
- Door status simplified — removed lock/unlock (BYD API can't detect interior lock button), shows door open/closed only
- Amber door-open warning — floating pill alert when any door is open (yellow, like AC-off is red)
- Pet name auto-resize — long names shrink to fit instead of overflowing
- Avatar images larger — reduced padding from 16dp to 6dp inside disc
- Dark mode settings fixed — all text colors, backgrounds, input fields, segmented control now properly switch in dark mode
Install
adb install pet-mode.apk