Everything posted by Vitaly
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.60-betaPre-release for in-car testing. Not merged into main. Branch: phase-A-proxy-recovery. This release bundles three beta increments since v1.2.57-beta. None of them changes behaviour on DL2 / DL3 / DL4 — all DL5-specific work is gated by the existing platform auto-detection. v1.2.60-beta (vc320) — DL5 Fission test: 3 new exploration probes (F12A / F12B / F12C) Pure additive rows inserted between F12 and F13 in the Fission live-test battery. F01..F12 + F13..F16 behave byte-identical to v1.2.59-beta — if a tester re-runs the suite the existing rows look exactly the same, the 3 new rows just give us more data. On any platform other than DL5 the 3 new rows SKIP via the existing outer DL5 gate. The goal of the 3 probes is to find a real DL5 resize path despite the stripped cmd activity verbs that v1.2.59-beta documented. F12A — verb-surface inventory. Pure read-only. Runs cmd activity (no-arg help) + cmd activity task + cmd window + a focused am help grep. Reports a one-line summary: am task resize=Y/N, set-task-windowing-mode=Y/N, cmd window set-display-windowing-mode=Y/N Authoritative inventory of what survived the BYD strip — no more guessing which subverb to try next. F12B — display windowing mode → freeform, retry resize, auto-revert. Sequence: cmd window set-display-windowing-mode <confirmedClusterDisplay> freeform sleep 1 s cmd activity task resize <taskId> 100 80 1820 640 sleep 2 s dumpsys mBounds for the task revert the display back to fullscreen so the cluster face is left exactly as F12 saw it. PASS = BREAKTHROUGH — display freeform unlocked task resize. Tests the hypothesis that the silent no-op of F11 in v1.2.59 was caused by the fission display declaring mDisplayWindowingMode=fullscreen, and that forcing the display itself into freeform is the missing piece. F12C — launch-time bounds via --activity-launch-bounds. Sequence: am force-stop <targetPkg> am start --display <id> --windowingMode 5 --activity-launch-bounds 100,80,1820,640 -n <component> sleep 3 s dumpsys mBounds PASS = BREAKTHROUGH — launch-time bounds honoured on cluster display. Tests whether DL5 honours launch-time bounds where post-launch resize is a no-op; if so, the production resize path becomes "tear down + relaunch at new rect" rather than mutating an existing task. WARN-on-unknown option so the row's message is self-explanatory. Safety / reversibility: F12B's only mutation (display windowing mode) is reverted in the same shell pipeline before the row returns. F12C's only mutation (re-launched activity) is cleaned up by the existing F14 force-stop two rows later. Touched files. app/build.gradle (319 → 320, 1.2.59-beta → 1.2.60-beta), dilink5/Dl5ClusterReconRunner.java (+3 TestDef entries, +3 switch arms in runFissionOne, +3 private implementations, +1 tokenForPkg busybox-safe grep-token helper), CHANGELOG.md. No new strings — no i18n surface touched. v1.2.59-beta (vc319) — DL5 cluster resize disabled at the UI when the ROM ships a stripped cmd activity binary Field-validated workaround. Source: log/byd_report_20260528_081206.log (BYD DiLink 5.0 / Android 12 / build SKQ1.230128.001, user-run Fission live tests). The report confirms the launch pipeline works end-to-end on DL5 — F01 PASS (service call auto_container 2 i32 1000 i32 16 opens the cluster projection), F04 + F05 PASS (am start --display 2 --windowingMode 5 -n ru.yandex.yandexnavi/.core.NavigatorActivity lands Yandex Navi fullscreen on the cluster face, user-confirmed visually), F13..F16 PASS (move-back-to-display-0 + sendInfo 18+0 cleanup chain works). But the report also proves resize is a ROM-level no-op on this build: F10 WARN — cmd activity set-task-windowing-mode → Unknown command: + exit=255 (verb stripped from the binary). F11 PASS-but-no-op — cmd activity task resize 76 100 80 1820 640 returns exit=0 with zero visible effect. F12 WARN — post-resize dumpsys shows mBounds=Rect(0, 0 - 1920, 720) mWindowingMode=fullscreen mMagicWindowMode=MAGIC_MODE_FULLSCREEN (bounds unchanged). That's the same outcome the in-app ClusterService.resizeActiveTask reflection-then-shell cascade was producing on every SeekBar drag since v1.2.26 — silently doing nothing while looking like it worked. Fix — strictly additive, fully reversible, DL2/DL3/DL4 unchanged. Platform.isClusterTaskResizeSupported(ctx) — new lazy capability probe. On DL5 it forks one sh -c "cmd activity set-task-windowing-mode 2>&1" with a 1.5 s timeout on a daemon thread and caches the result both in a volatile field and a sticky SharedPreferences key (platform_cluster_resize_supported = "yes" | "no"). Conservative: any error or ambiguous output → "supported" (UX never downgrades on uncertain signal). On DL2/DL3/DL4 the method short-circuits to true immediately — no probe, no behavioural change on those platforms. DashCastApp.onCreate primes the probe at startup via Platform.primeClusterResizeProbe(this) so UI reads return the cached answer instantly without forking on the main thread. ClusterService.resizeActiveTask short-circuits at entry when !isClusterTaskResizeSupported(this), logs once via the new static sResizeUnsupportedLogged gate, and returns without running the IATM-then-shell cascade — saves ~30 useless verbs per SeekBar drag. MainActivity hides btn_toggle_resize + panel_resize on DL5 when the probe returned "no", so the user never sees a broken affordance. No new strings. Reversibility. When a future BYD ROM update restores the verb, wiping the SharedPreferences key re-enables the SeekBar with zero code change. Docs. New doc_api/DL5_CLUSTER_RESIZE_LIMITATION.md with the full F10/F11/F12 verbatim plus three RE-able avenues for an actual DL5 resize. v1.2.58-beta (vc318) — Phase A step 1: daemon auto-recovery in BetaProxyClient typed verbs When the proxy daemon dies (OOM kill, manual kill -9, etc.), production typed verbs now silently bootstrap a fresh daemon, gated by a 10 s cooldown (anti-storm). When the daemon is healthy, behaviour is byte-identical to v1.2.57-beta. Wrapped verbs (production hot path + cluster ops): runShell, setOverscan, getPidsByPackage, autoContainerSendInfo, forceStopPackage, releaseVirtualDisplay, launchAndForce, moveAndResize, cleanFissionStacks. Intentionally not wrapped: ping, runPhase4Probes (health / diag — retry would mask failures), create* (unchanged). In-car test plan for v1.2.60-beta Smoke test (any platform). Boot normally → enable cluster mirror, force-stop a mirror, switch YouTube → cluster. Must behave exactly as v1.2.57-beta, no visible regression. Resize SeekBar: visible on DL2/DL3/DL4, hidden on DL5 (workaround from v1.2.59). DL5 Fission probe (NEW — primary objective of this release). Open Diag → run Fission live tests with any installed launchable target (2GIS, Yandex Navi, Maps…). Watch the new rows: F12A always passes (it's read-only) — copy its msg line, it tells us which verbs survived. F12B PASS = breakthrough on the "display freeform" hypothesis. F12C PASS = breakthrough on the "launch-time bounds" hypothesis. Both WARN = report stays useful, we'll design the next probe based on F12A's inventory + F12B/F12C raw output. Daemon auto-recovery sanity (carried over from v1.2.58). adb shell pgrep -f dashcast_proxy adb shell kill -9 <pid> then trigger any cluster action. Must succeed silently with a single info log line: attemptReconnect: bootstrapping daemon (cooldown gate passed) followed by daemon ready (uid=2000 pid=…). Logs to collect. Send the full Fission report via the existing "Send via Telegram" button + logcat tags BetaProxyClient, Dl5ClusterRecon, plus any WARN/ERROR. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.58-beta-phase-A-step1Pre-release for in-car testing. Phase A step 1 — daemon auto-recovery in BetaProxyClient typed verbs. When the proxy daemon dies (OOM kill, manual kill -9, etc.), production typed verbs now silently bootstrap a fresh one with a 10s cooldown gate (anti-storm). Behaviour when the daemon is healthy is byte-identical to v1.2.57-beta. In-car test plan Smoke test: boot normally → enable cluster mirror, resize via SeekBar, force-stop a mirror, switch YouTube → cluster. Must behave exactly as before, no visible regression. Auto-recovery: from ADB: adb shell pgrep -f dashcast_proxy adb shell kill -9 <pid> then trigger any cluster action (resize or force-stop). Must succeed silently with a single info log line: attemptReconnect: bootstrapping daemon (cooldown gate passed) followed by daemon ready (uid=2000 pid=…). Logs to collect: logcat tag BetaProxyClient plus any WARN. Wrapped verbs (production hot path + cluster ops) runShell, setOverscan, getPidsByPackage, autoContainerSendInfo, forceStopPackage, releaseVirtualDisplay, launchAndForce, moveAndResize, cleanFissionStacks. Intentionally not wrapped ping, runPhase4Probes (health/diag, retry would mask failures), createVirtualDisplay (Surface lifecycle owned by caller). Zero-regression guarantees Daemon healthy → identical path, overhead = one volatile read. Daemon dead, reconnect OK → silent recovery, single info log line. Daemon dead, reconnect fails or cooldown-gated → throws BetaProxyException exactly like before → callers still fall back to legacy AdbLocalClient.executeShell*. Branch: phase-A-proxy-recovery — not merged into main, beta/1.2.0-dilink5 untouched. LinksAPK download GitHub release page
-
BYD’s first flash-charging model, Denza Z9 GT, surpasses 10,000 deliveries in 2.5 months
Denza, a premium brand under BYD, announced today that its Z9 GT has officially surpassed 10,000 cumulative deliveries. The vehicle was first launched in China on March 5th and then in Europe on April 9th. This delivery milestone comes just two and a half months after the vehicle first began reaching customers on March 13. The Z9 GT, which starts at 269,800 yuan (39,700 USD), is the world’s first mass-produced vehicle to feature BYD’s second-generation Blade Battery and flash-charging technology. The model is available in both pure electric (BEV) and plug-in hybrid (PHEV) configurations, with pricing ranging up to 369,800 yuan (54,400 USD) in China. Performance The vehicle’s rapid charging capabilities are a standout feature, largely attributed to the second-generation Blade Battery, which boasts an increased energy density of 190–210 Wh/kg, supported by a comprehensive thermal management system. In standard temperature conditions, the Z9 GT can charge from 10% to 70% in 5 minutes, and reach 97% in 9 minutes. In extreme cold – down to -30°C – charging from 20% to 97% takes 12 minutes. In terms of range, the pure electric version offers a maximum CLTC range of 1,036 km. The PHEV variant provides a pure electric range of 401 km and a combined range of 1,301 km. Denza celebrated the milestone on social media. Technology and Design Built on BYD’s “e3” (Yi San Fang) intelligent vehicle control platform, the pure electric trim delivers a total power output of 850 kW (1,140 hp) and a peak torque of 1,210 N·m, enabling a 0–100 km/h acceleration time of 2.7 seconds. The vehicle also features a minimum turning radius of 4.62 meters, the “God’s Eye” 5.0 intelligent driving system, and the DiSus-A intelligent air body control system. The Z9 GT’s design features a sleek, aerodynamic profile with a “Z”-shaped side trim and an integrated floating rear spoiler. Inside, the cabin is equipped with zero-gravity seats for the front passenger, a smart refrigerator, and an AR-HUD system, all complemented by a new “Lava Red” interior colour option. Global sales performance of the Denza brand. Following the launch of the Denza Z9 GT in early March, the Denza brand’s global sales reached 7,133 units in March this year, a month-on-month increase of 29.7%, and 11,250 units in April, up 57.7% from the previous month.
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.57-betaDashCast v1.2.57-beta Audit pass — Tier S + A + B + C complete (52/52 Java files, 113/113 res files). This release closes the systematic per-file audit started in v1.2.56-beta. All applicative code under com.byd.dashcast has now been reviewed against the project's resource-leak / lifecycle / i18n / dead-code checklists. The fixes below are the actionable findings; the rest of the audit confirmed existing code is correct. Fixes Bugs BootReceiver — fix double-finish() race on PendingResult. A goAsync() boot handler could call result.finish() twice when the 8 s hotspot pre-warm completed before the synchronous setup steps incremented the pending counter. The counter is now seeded at 1 (sentinel) and a final releaseOne.run() releases the sentinel — standard PendingResult coordination pattern. Eliminates the IllegalStateException: finish() called twice warnings in logcat at boot. DiagActivity — populateLaunchableApps() moved off the UI thread. Querying PackageManager for every launchable activity could freeze the Diag tab for 200–500 ms on devices with many apps. The query now runs on a background thread, with UI gating on the "Run DL5 tests" button and an mDestroyed guard before runOnUiThread. SettingsActivity — remove dead duplicate setChecked(). A leftover post-refactor setter that never had any effect. Internationalisation HotspotActivity — friendlyMacName() was returning a hardcoded French string ("Appareil xx:xx") on the connected-clients card. Extracted to hotspot_client_default_name and translated into the 12 supported locales (fr, en, de, es, it, ru, uk, be, kk, uz, tr, ar). ClusterResizeActivity — "Aucun package" Toast extracted to resize_no_package + 12 locales. Dead code removal AdbLocalClient — removed 5 unused public methods (~373 LoC, 31 % of the file): runClusterDisplaySizeTest, captureClusterDisplay + its BitmapCallback interface, and 3 related helpers. All callsites verified absent across the codebase. Trimmed Bitmap/BitmapFactory imports. Audit summary Tier Files Outcome S (hot path) 5 / 5 Done — 4 fixes A 10 / 10 Done — 4 fixes B 33 / 33 Done — 2 i18n fixes C 4 / 4 Done — 0 fixes Total 52 / 52 10 fixes applied across v1.2.55→v1.2.57 Resources: 113 / 113 reviewed — 0 dead layouts / strings / drawables / styles. i18n parity: 100 % across 12 locales × 480 keys. Known items (deferred — documented in audit-state) These were classified MED and not auto-applied; they require validation before landing: MirrorDaemon.setupMirror — Surface read from Parcel is not release()d on the daemon side. Net effect unclear without a device-side test (dumpsys SurfaceFlinger before/after 100 mirror cycles). Phase4Verbs.execShell (daemon) — timeoutMs parameter is silently ignored and stdout/stderr are read sequentially. To be hardened along the same pattern as ProxyDaemonMain.runShell (bounded waitFor + destroyForcibly + redirectErrorStream(true)). MainActivity.mPendingAutoLaunchPkg — auto-launch-on-cluster preference has been a no-op since refactor 3b77081. One-line fix awaits user decision. Compatibility DiLink 3.0 (BYD Seal EU production) — primary target, fully validated. DiLink 5.0 (BYD-AUTO tester) — all shared code paths preserved. DiLink 2.0 (legacy tester) — all DL5/DL4 gates use Platform.isAutoDetectedDiLink2(); behaviour unchanged. Artifact DashCast-v1.2.57-beta-debug.apk (signed with bydPlatform key — BYDAUTO permissions granted). LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.56-betaDL5 Fission test — user-pickable target app Field-validated bug from the v1.2.54-beta DL5 tester run (log/byd_report_20260527_080752.log): 3 PASS / 13 SKIPPED — F02 aborted with ru.yandex.yandexmaps not installed — F03..F16 skipped even though the tester actually had 2GIS (ru.dublgis.dgismobile) and Yandex Navi (ru.yandex.yandexnavi, distinct package from Yandex Maps) installed. The Fission catalog was hard-wired to one specific package, so it had no way to use the perfectly valid alternatives that were sitting right there. What's new App picker before the destructive test. Tapping Test Fission now shows a single-choice dialog listing every launchable app on the device (alphabetical by label, DashCast excluded, rows formatted <label> — <package> so variants like Yandex Maps vs Yandex Navi are visible). Two-step UX: pick app → confirm dialog now reads Target: <App Name> (<package>) then explains the destructive resize/move pipeline → tap Run. Runner parameterised on the target package. All 14 hard-coded ru.yandex.yandexmaps reads inside the F-tier (F02 install check, F03/F15 am compat enable/reset, F04/F06/F08 pre-launch force-stop, F05/F07/F09 NO-branch cleanup, F14 final force-stop, move-back am start --display 0) replaced by the chosen package. extractYandexTaskId is now generic — uses Pattern.quote(targetPkg) for client-side regex and the last two dot-segments as a shell-safe filter token in the dumpsys activity activities grep. Catalog row titles generalised: F02-F15 no longer say "Yandex Maps" — they say "target app" so the diag report reads sensibly for any chosen package. i18n (12 locales): 3 strings generalised (_hint, _confirm_msg, _prompt_msg_fmt — the YES/NO prompt now reads "Is 2GIS visible on the cluster screen? (testing display 3)"), 2 new strings (_pick_title, _pick_empty), zero MissingTranslation regression. What's preserved (compat) Legacy 1-arg runFission(Context, Listener) overload still defaults to Yandex Maps so any out-of-tree caller keeps working. Test Fission button still gated on Platform.isAutoDetectedDiLink5() — DL2/DL3/DL4 unaffected. Cancelling the picker dialog is a clean no-op. Cleanup steps F14/F15/F16 still run unconditionally as before. Touched files app/build.gradle (315 → 316) dilink5/Dl5ClusterReconRunner.java — FISSION_TARGET_PKG → DEFAULT_FISSION_TARGET_PKG + sLastFissionTarget volatile + FissionState.targetPkg/targetLabel, two new runFission overloads, generalised catalog texts (~70 LoC net) DiagActivity.java — new pickFissionTargetThenConfirm() + confirmFissionRun(pkg, label), 2-arg runClusterDl5FissionTests (~70 LoC net) 12 × strings.xml — 3 generalised + 2 new keys Behavioural contract (DL5 tester) Install over v1.2.55, open Diag → Cluster DL5 → tap Test Fission → pick e.g. 2GIS — ru.dublgis.dgismobile → confirm → F01 opens projection → F02 PASS (target installed) → F03 enables FORCE_RESIZE_APP on 2GIS → F04 launches 2GIS on display 2 → "Is 2GIS visible on the cluster screen?" → NO → F06 on display 3 → YES → F10/F11/F12 actually run the freeform + resize + bounds-verify chain (no more skip on wrong package) → F13/F14/F15/F16 cleanup. Report's Target= line reflects the actual chosen package. — Not merged to main. Pre-release on beta/1.2.0-dilink5. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.55-betaDashCast v1.2.55-beta — field-validated fixes + Tier S audit pass + auto-launch restore Beta build 315 on branch beta/1.2.0-dilink5. Not merged to main. This release bundles the field-validated bug fixes that landed shortly after v1.2.54-beta, a full Tier S code audit (5 hot-path files — MirrorDaemon, ClusterInputForwarder, ClusterMirrorManager, ClusterService, MainActivity — totalling ~6 000 LoC), and the restoration of the auto-launch feature that had been silently broken since May 9 2026. Bug fixes (field-validated) Waze first-tap fix — singleInstance / taskAffinity apps were routed by AOSP to display 0 on cold launch despite ActivityOptions.setLaunchDisplayId. New ClusterService.enforceTaskOnDisplay() schedules a deferred IActivityTaskManager.moveTaskToDisplay, then applies the full setTaskWindowingMode(FREEFORM) + resizeTask(bounds) post-move sequence (factored as moveTaskToDisplayInternal(..., enforceOnly)), so per-app custom insets are no longer dropped when the enforcer fires at T+2.5s. Mirror stayed black until fullscreen+back — the active mirror path is now tracked in ClusterMirrorManager via a mMirrorViaDaemon flag; daemon-arrival callbacks stopClusterMirror() first when the current path is direct, so attemptStartMirrorWithCurrentHolder actually re-establishes via the daemon. 1.08 GB storage growth — every save / share / sniffer run was producing a fresh timestamped file under getExternalFilesDir with nothing rotating. New AppLogger.pruneOldFiles keeps the 3 most recent per prefix. Orphan logcat processes left over from setsid-detached sniffer runs are now reaped at app start via ShellGateway.execShell, gated on the absence of re_sniffer_file_path in byd_diag_prefs so an in-progress capture is never clobbered if the Activity is recreated under memory pressure. "Hey Jarvis" wake-word toggle was a no-op — onWakeWordToggle now auto-starts VoiceService (requesting RECORD_AUDIO if needed) so the engine actually receives audio frames. Auto-launch on cluster connect — feature shipped in v0.2.3-alpha but the consumer block in onClusterDisplayConnected was unreachable because the pending-package field was never assigned. Restored in onCreate (one line). The toggle now actually fires the chosen app on the first cluster connection of each Activity instance. Tier S audit pass — hot-path hardening Five hot-path files audited end-to-end, batches committed independently. MirrorDaemon.setupMirror — dumpsys SurfaceFlinger Process leaked stderr / stdin FDs (only stdin was wrapped in try-with-resources). Wrapped output streams + explicit p.destroy() in a finally block. 1 FD per setupMirror call eliminated. ClusterInputForwarder.injectTouchAtMulti — mTouchDownTime reset on ACTION_UP / ACTION_CANCEL was placed after the daemon-path early return;, so the reset never ran on that path. Moved into a finally block of the synchronized region. Harmless today (ACTION_DOWN resets unconditionally), but removes a latent trap for any future MOVE-without-DOWN sequence. ClusterMirrorManager — dead mMirrorSurface field (assigned 4 times but never read; the Surface lifecycle is owned by MainActivity via the TextureView's SurfaceTexture). ClusterService — six hardcoded notification strings (channel_name, channel_desc, initializing, active with %1$d displayId, stopped, disconnected) extracted to notif_cluster_* keys, translated in all 12 locales. Notification title changed from the legacy "BYD App" to @string/app_name ("DashCast"). MainActivity — Toast "✓" confirmation literal in the usage-stats reset path extracted to toast_usage_stats_reset × 12 locales. Verified safe: receiver/handler/surface/threads/executor/bindService lifecycle, isFinishing()/isDestroyed() guards on async callbacks, SharedPreferences.apply() everywhere, no PendingIntent, no MotionEvent leak (pre-allocated 16-pointer arrays mirror ClusterInputForwarder), one-shot reflection only. Two latent regressions in the field-validated fix set were caught and corrected (enforceTaskOnDisplay missing the post-move resize sequence; orphan-sniffer kill being unconditional). Net diff after audit: +64 / -56 vs +192 / -2 before audit. UI — auto-launch indicator The auto-launch toggle, previously duplicated as an inline CheckBox on every list row, has been removed from the row layouts. The single source of truth is now the MaterialSwitch in the long-press action bottom sheet (dialog_app_actions.xml). A small amber badge (▶ on a #FFC107 oval with white stroke) is now shown on the app icon in both list and grid modes when the app is marked as auto-launch. New drawable bg_auto_launch_badge.xml; the accessibility label reuses the existing app_state_auto string (already localised in all 12 locales). i18n Two new strings added in all 12 supported locales (fr base + en/de/es/it/ru/uk/be/kk/uz/tr/ar) for the audit batches: notif_cluster_* (6 keys × 12) and toast_usage_stats_reset (1 key × 12). Invariants preserved 16-pointer pre-allocated touch arrays (mFwdPointerIds / mFwdClusterXs / mFwdClusterYs mirroring ClusterInputForwarder). MirrorDaemon PROTOCOL_VERSION = "2" unchanged. SurfaceControl.Transaction instance API unchanged. Preserved-by-design dead code documented in CHANGELOG v1.2.12 (key-injection path in MirrorDaemon / ClusterInputForwarder, btnActivateCluster removed in v1.2.76) left untouched. Install adb install -r DashCast-v1.2.55-beta-debug.apk versionCode 315 (previous beta v1.2.54-beta = vc313). LinksAPK download GitHub release page
-
Линейку BYD пополнит дальнобойный гибрид Dolphin G. Он создан специально для Европы
Компания BYD готовится вывести на европейские рынки новый подзаряжаемый гибридный хетчбэк Dolphin G DM-i. Сообщается, что суммарный запас хода модели превысит 1000 км. Европейское подразделение BYD распространило первые официальные изображения гибридного хетчбэка Dolphin G с силовой установкой DM-i. Модель пополнит семейство «Дельфинов» (так с английского переводится слово dolphin), которое раньше состояло только из электрокаров. Электрические пятидверки – это «просто» Dolphin и более компактный автомобиль, который в Европе известен как Dolphin Surf (в Китае он называется BYD Seagull). Электрический хетчбэк BYD Dolphin EV В компании отметили, что гибрид разработан специально для Старого Света, но при этом его планируют продавать и в других регионах. Электрический хетчбэк BYD Dolphin Surf EV Внешность гибридного BYD DolphinУ гибридного хетчбэка собственный дизайн экстерьера – более «гладкий», если сравнивать с электроверсиями. Dolphin G имеет фары довольно-таки плавной формы, «утопленные» ручки дверей и «парящую» крышу. Гибридный хетчбэк BYD Dolphin G DM-i Производитель еще не показал заднюю часть машины и интерьер. Но на одном из опубликованных изображений заметно, что в салоне разместили крупный сенсорный экран мультимедийной системы. Длина гибридного BYD Dolphin G составляет 4,16 м. Таким образом, по этому показателю он занял нишу между электрокарами. Длина европейского BYD Dolphin без «приставки» равна 4290 мм, BYD Dolphin Surf – 3990 мм. Расстояние между осями гибрида пока не раскрыто. Колесная база «старшего» EV-хетчбэка – 2700 мм, «младшего» – 2500 мм. Гибридный хетчбэк Dolphin G DM-i Что еще известно о новинкеВ BYD пока не рассказали о «начинке» нового хетчбэка. Зато компания сообщила, что совокупный запас хода Dolphin G превышает 1000 км. Европейские СМИ предполагают, что установка DM-i у модели такая же, как у местного гибридного кроссовера BYD Atto 2. Последний доступен с бензиновым атмосферным двигателем 1.5 (98 л.с.) и одним электромотором. Суммарная мощность паркетника – 166 или 212 л.с. Кроссовер Atto 2 предлагается с батареей емкостью 7,8 или 18 кВт⋅ч. Запас хода в электрорежиме в зависимости от версии – 40 или 90 км. Гибридный хетчбэк BYD Dolphin G DM-i Ожидается, что презентацию гибридного BYD Dolphin G DM-i проведут в Европе в начале лета. Антон ВАСИЛЬЕВ (@chinamashina)
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.54-betaDashCast v1.2.54-beta — cumulative release since v1.2.51 This pre-release bundles three internal builds (1.2.52, 1.2.53 and 1.2.54) into a single OTA-detectable package. Install on DL3 / DL5; DL2 testers only. v1.2.54-beta — audit pass (build 313) Read-only audit over 52 Java files and 108 XML resources. No P1 bug found. Four zero-risk cleanups applied; all other findings deferred until device-side validation. Code BetaProxyClient.onReceive: replace the residual pingBinder() round-trip by isBinderAlive() on the PROXY_CONNECTED broadcast path — coherent with the P2 migration already in place a few lines below. TaskRemover: switch from System.out.println / printStackTrace to android.util.Log so daemon-side traces show up in logcat. Resources Drop the orphan drawable ic_screenshot.xml. Drop 10 orphan string keys across all 12 locales (120 entries, all 12 strings.xml stay aligned at 469 keys each): diag_beta_report_copied, diag_dl5_cluster_toast_telegram_missing, diag_placeholder_subtitle, diag_placeholder_title, diag_tab_stress, keyboard_bridge_btn_back, keyboard_bridge_btn_close, keyboard_bridge_btn_enter, keyboard_bridge_hint, keyboard_bridge_input_hint. Platform impact: zero — no platform-gated code modified. Beta wire protocol PROTOCOL_VERSION=2, MirrorDaemon LocalSocket 1007, SurfaceControl.Transaction instance API and ClusterInputForwarder 16-pointer pool all untouched. v1.2.53-beta — defensive cleanup of v1.2.52 (build 312) Keep v1.2.52's grace period and layout listener (both needed for the TextureView ready signal on cold boot). Remove the redundant prefs-restore mLastLaunchTime arming line at MainActivity L1048 that was double-arming the launch debouncer when the preference was restored on resume. v1.2.52-beta — MainActivity display-state race + TextureView black-preview fix (build 311) Fix the race where MainActivity polled Display.STATE_ON before the projection display was actually registered with DisplayManager, leading to a stuck "Waiting for cluster…" state on DL5 cold boot. Add a surfaceTexture ready listener to the preview TextureView and gate the first frame on it — fixes the all-black preview tile that some users hit on the first projection start of a session. Introduce a launch-debounce grace period so the user can't double-tap the projection button and trigger two ClusterService.start() calls back-to-back. Upgrade notes No new permissions, no schema change, drop-in replacement of any 1.2.5x-beta. DL2 testers: same caveats as before (no display fission; functional parity limited to projection + diag). Signed with the same bydPlatform keystore — BYD system permissions remain granted on install. versionCode 313 — the car's update checker will detect the bump and offer the install automatically. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.51-betaChanges since v1.2.49-beta: Material 3 Dark theme upgraded to Premium Cyber Cockpit Modern EV look with electric blue, neon accents, and deeper high-contrast backgrounds. Enhanced hand ergonomics and physical automotive touch targets (from 28dp completely rounded to sleek 16dp rounded corner rectangles). Voice tab PoC step 2/3: wake-word placeholder using openWakeWord ONNX Runtime (Hey Jarvis, built with arm64-v8a and armeabi-v7a native optimized filters). Bumped versionCode to 310 to guarantee the car OTA updater detects the update cleanly. Guaranteed full backwards-compatibility with older DiLink 3 units while adopting native glass effects on DiLink 5. LinksAPK download GitHub release page
-
BYD Dolphin G plug-in hybrid hatchback broke cover ahead of European launch
The BYD Dolphin G DM-i plug-in hybrid hatchback broke cover as a model designed for the European market. Its prices will be revealed in June, with deliveries scheduled for the fall of 2026. The new Dolphin G DM-i has a combined range of 1,000 km. The new BYD Dolphin G DM-i adopts a unique design language with thin headlights, an active air intake, and two airflows in the front bumper. Other features of this hatchback include blackened rims, semi-hidden door handles, and darkened D-pillars that create a floating roof effect. The car has a surround-view camera system complemented by front and rear parking sensors. The new Dolphin G DM-i is finished in orange. Its body length reaches 4,160 mm, while the width is 1,825 mm. For clarity, it is 130 mm shorter and 55 mm wider than the European variant of the Dolphin BEV. It has a black interior with a floating touchscreen in the dashboard and “G” emblems on headrests. The BYD Dolphin G DM-i There is no information about the powertrain of the BYD Dolphin G DM-i. There is a high chance it will stay close to the BYD Atto 2 DM-i (Yuan Up DM-i) launched in foreign markets. It offers a 1.5-liter naturally aspirated engine with a peak power output of 72 kW (97 hp) and an electric motor for 145 kW (194 hp). Two LFP battery variants are available for the Atto 2 DM-i with capacity variants of 7.8 kWh and 18 kWh. The combined peak power output is 156 kW (209 hp). The car’s electric range lies between 40 and 90 km under WLTP conditions. It was officially disclosed that the combined range of the BYD Dolphin G DM-i reaches 1,000 km. More information about the Dolphin G DM-i will be disclosed during the launch ceremony scheduled for June 2026. The first batch of cars will be handed over to customers this fall. BYD is actively developing in foreign markets. According to China EV DataTracker, BYD delivered 149,606 units domestically, down 38.5% Year-Over-Year. However, its global sales (with exports included) reached 314,100 cars, down 15,7% Y-O-Y.
-
BYD launches 2026 Sealion 06 DM-i with its fifth-gen hybrid tech and 310 km EV range
BYD has officially launched the 2026 model year Sealion 06 DM-i, introducing four trim levels to the market. The new lineup is priced between 129,900 yuan (19,100 USD) and 159,900 yuan (23,500 USD). One of the major upgrades for the 2026 model is the integration of BYD’s fifth-generation DM technology, which pushes the maximum CLTC pure electric range to 310 km. Pricing and trim levels Trim levelPrice (yuan and USD)205 Pilot Edition129,900 (19,100)205 Pilot Pro Edition139,900 (20,600)310 Voyage Edition149,900 (22,000)310 Flagship Edition159,900 (23,500) Design The 2026 Sealion 06 DM-i continues to utilise the brand’s signature design language, now complemented by a new “Glazed Silver” exterior colour and “Twilight Blue” interior theme. Inside, the vehicle focuses on passenger comfort with the addition of front-seat memory and massage functions, as well as a leg rest for the front passenger. A new intelligent fragrance system has also been integrated. BYD Sealion 06 DM-i with “God’s Eye B”. Credit: Yiche Intelligent driving and cockpit The new model offers an optional “God’s Eye B” advanced driving assistance system (DiPilot 300). This system provides full-scenario capabilities, including City Navigate on Autopilot (CNOA), High-speed Navigate on Autopilot (HNOA), traffic light recognition with real-time countdowns, adaptive traffic maneuvering, and roundabout navigation. Complementing this is the high-end DiLink 150 smart cockpit, featuring a redesigned UI and a customised version of AutoNavi Maps for a human-machine interaction experience. Powertrain and performance Powered by the fifth-generation DM technology, the vehicle achieves a maximum CLTC pure electric range of 310 km. It boasts an NEDC fuel consumption rate of 3.3L per 100km when in a low-battery state, and offers a combined range of 1,845 km on a full tank and full charge. Chassis and safety The 2026 Sealion 06 DM-i is equipped with the DiSus-C intelligent damping body control system, now featuring a road surface pre-scanning function. This system can proactively identify road irregularities such as manhole covers and speed bumps, adjusting the suspension damping coefficient in real-time. Furthermore, the vehicle introduces a “motion sickness prevention mode,” which optimises the chassis, environmental settings, and powertrain to enhance passenger comfort. For safety, the model includes a high-speed tyre blowout stabilisation system, capable of millisecond-level responses to maintain control during a blowout at speeds up to 140 km/h. BYD Sealion 06 sales perfoemance in China. BYD Sealion 06 domestic sales reached 19,649 units in April 2026, up 7.7% from March. Monthly deliveries stood at 18,237 units in March, 6,287 in February, and 6,640 in January. The interior of BYD Sealion 06 Dm-i.
-
CATL dominates April 2026 China power battery market with 47% share
According to the latest data released by Kerui for April 2026, the power battery industry in China maintained a stable and highly concentrated competitive landscape. CATL continues to lead the market by securing a 47.0% market share, while FinDreams and CALB followed in second and third place, respectively. CATL recorded an installation volume of 28,694 MWh in April, representing a year-on-year increase of 30.2%. The industry leader’s core customer base remains diverse, covering mainstream automakers such as Geely, Changan, Xiaomi, Li Auto, and Nio. Specifically, Geely accounted for 9.5% of CATL’s installations, followed by Changan at 8.9%, Xiaomi at 8.5%, Li Auto at 8.3%, and Nio at 6.6%. BYD‘s FinDreams ranked second with an installation volume of 11,133 MWh, capturing an 18.3% market share despite a slight year-on-year decline of 3.2%. The company remains heavily reliant on its internal ecosystem, with 58.0% of its supply concentrated on BYD. However, it also contributed to other brands, with installation shares of 7.5% for Xiaomi, 7.0% for Fang Cheng Bao, 5.3% for Xpeng, and 5.1% for Denza. April 2026 power battery installations top 10 (MWh) RankCompanyMWhShareTop 1 OEMTop 2 OEMTop 3 OEMTop 4 OEMTop 5 OEM1CATL28,69447.0%Geely (9.5%)Changan (8.9%)Xiaomi (8.5%)Li Auto (8.3%)Nio (6.6%)2FinDreams11,13318.3%BYD (58.0%)Xiaomi (7.5%)Fang Cheng Bao (7.0%)Xpeng (5.3%)Denza (5.1%)3CALB5,1988.5%SinoTruk (16.0%)GAC-Toyota (12.1%)Xpeng (9.9%)Leapmotor (8.7%)GAC Aion (7.4%)4Gotion3,7056.1%Leapmotor (18.3%)SGMW (17.8%)Chery (17.4%)Hanma (11.2%)Changan (7.2%)5EVE2,5504.2%Foton (20.9%)Xpeng (19.2%)Sany (14.0%)Farrizon (7.2%)GAC Aion (4.7%)6Rept Battero1,8813.1%Sany (31.9%)SGMW (22.2%)SAIC (18.6%)Foton (3.9%)SAIC Maxus (2.7%)7Zenergy1,6712.7%Leapmotor (51.2%)GAC-Toyota (15.4%)SGMW (11.8%)SAIC-GM (9.5%)FAW Hongqi (4.6%)8Svolt1,6152.6%Leapmotor (44.3%)GWM (37.1%)Voyah (9.5%)Geely (4.1%)Spotlight (3.6%)9Sunwoda1,3632.2%Nio (17.4%)SGMW (16.7%)Dongfeng-Nissan (14.4%)Dongfeng (12.0%)Dongfeng-Liuzhou (10.3%)10Energee9171.5%Geely (91.1%)T KNG (2.7%)GAC Aion (2.6%)Farizon (2.1%)Jinbei(0.6%)Compiled by CarNewsChina CALB, Gotion High-tech, and EVE Energy rounded out the top five, with installation volumes of 5,198 MWh, 3,705 MWh, and 2,550 MWh, respectively. These companies demonstrated strong growth momentum, with year-on-year growth rates reaching 50.1%, 25.2%, and 27.2%. The sixth through tenth positions were held by Repr Battero, Zenergy, Svolt, Sunwoda, and Geely’s Energee, with market shares ranging between 1.5% and 3.1%. Energee exhibited extreme customer concentration, with 91.1% of its installations supplied to Geely. Xiaomi is FinDreams’ biggest customer besides BYD, while Leapmotor is the top client for three battery manufacturers: Gotion, Zenergy, and Svolt. Although Leapmotor uses CATL batteries in its high-end D19 and the upcoming D99, it isn’t considered a major customer for CATL so far. BYD is FinDreams’ biggest customer, and Geely is Energee’s biggest customer, which is to be expected. However, Great Wall Motor is not actually the largest customer of its own battery subsidiary, Svolt.
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.49-betaDL5 Fission task-id extractor hardening (v1.2.49-beta) Third field test (log/byd_report_20260525_152233.log, 11 PASS / 1 WARN / 0 FAIL / 4 SKIPPED) was the first run where the v1.2.48 interactive multi-display probe worked end-to-end: testeur said NO on display 2 (hidden), YES on display 3 → cluster confirmed. One bug remained — the awk-scoped extractYandexTaskIdOnDisplay returned -1 on this ROM (the actual dumpsys activity activities layout doesn't match the (mPreferredTopFocusableRootTask|mLastFocusedRootTask)=Task{…A=…yandexmaps} pattern), so F10 WARNed and F11/F12 SKIPPED → the resize never ran. Fix Drop per-display scoping. Since the runner force-stops Yandex before every candidate launch, exactly ONE Yandex task exists at the moment of YES. A global match for Task{…yandexmaps…} is sufficient and ROM-agnostic. Two-pattern extractor. Primary: Task\{[^}]*ru\.yandex\.yandexmaps[^}]*\} → #(\d+). Fallback: taskId=(\d+)[^\n]*ru\.yandex\.yandexmaps. 4 attempts with 0/250/500/1000 ms backoff. Catches late-registered tasks (Yandex SplashScreen → main activity transition may not have published the task at the exact YES tap). Debug capture into r.detail. Raw filtered dumpsys lines (grep -nE 'Task{|taskId=|yandexmaps' | grep -i yandex | head -20) attached to F07/F09 (and F10 if it retries). Any future regression is debuggable from the field report alone, no adb access needed. Touched files app/build.gradle — versionCode 306→307 + per-version comment. dilink5/Dl5ClusterReconRunner.java — one method replaced + two call sites updated. ~80 LoC. Safety Same UX as v1.2.48 (popup flow unchanged). Non-DL5 platforms see no behavioural difference. R-tier listener untouched. No new permission, manifest, dependency, layout, or string resource. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.48-betaDL5 Fission runner — interactive multi-display probe (v1.2.48-beta) After the second field test (log/byd_report_20260525_144058.log, 9 PASS / 2 WARN / 1 FAIL) it became clear that dumpsys-only heuristics will keep producing false negatives on this 4-display DL5 ROM. v1.2.48 pivots to an interactive F-tier that asks the testeur, in their locale, on each candidate display in turn, whether Yandex Maps is actually visible on the cluster screen. New F-tier flow (16 steps) F01 — opens the BYD cluster projection itself (service call auto_container 2 i32 1000 i32 16 s16 "") so fission displays become routable. Sets a flag so F16 only tears down if F01 opened it. F02 / F03 — Yandex installed + launcher resolved / enable FORCE_RESIZE_APP compat override (unchanged from v1.2.47). F04 / F06 / F08 — force-stop Yandex then am start --display N --windowingMode 5 -n <component> for N in {2, 3, 4}. SKIPs once a previous candidate has been confirmed. F05 / F07 / F09 — NEW localized Yes/No popup asking « Yandex Maps est-il visible sur l'écran cluster ? (test sur le display N) ». Runner blocks on a CountDownLatch (180 s safety timeout) while the AlertDialog is shown via the new Listener.onPromptYesNo callback. YES → records this display as the cluster, extracts the Yandex taskId via a properly-scoped awk pass (walks the dump, tracks current displayId=N block, only matches (mPreferredTopFocusableRootTask|mLastFocusedRootTask)=Task{…yandexmaps} inside that block — the awk fix the v1.2.47 false-negative diagnostic was missing), skips remaining candidates. NO → moves Yandex back to display 0 + force-stops it, so the next candidate launches from a clean slate. TIMEOUT → WARN. Every step logs prompt title / message / user answer in the report. F10 — NEW cmd activity set-task-windowing-mode <taskId> 5 on the confirmed cluster display. Workaround for the display-level fullscreen lock (mDisplayWindowingMode=fullscreen) that made v1.2.47's task resize silently no-op. F11 / F12 — resize task + verify new bounds (same logic as v1.2.47, now on the confirmed display + freeform-locked task). F13 — move Yandex back to display 0 via resolved launcher. F14 / F15 / F16 — cleanup: force-stop Yandex, reset FORCE_RESIZE_APP override, close the projection (sendInfo 18 + sendInfo 0) only if F01 opened it. i18n 4 new keys × 12 locales = 48 entries: diag_dl5_fission_prompt_title, _msg_fmt (with %1$d for display id), _yes, _no. Hand-curated per locale; Uzbek apostrophes properly escaped. Safety Strictly scoped to the F-tier diagnostic battery on DL5. Non-DL5 platforms still see one SKIPPED row. R-tier (R01..R30) listener uses the new default onPromptYesNo (= NO) and never triggers a prompt because no F-step is in the R-catalog. F01 / F16 are symmetric: the projection is only closed if F01 opened it in this run. 180 s prompt timeout safety net. No new permission, no manifest change, no new dependency. See CHANGELOG for full diff. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.47-betaDL5 Fission runner fixes after first field run (log 20260525_142241). Why Field test scored 10 PASS / 2 WARN / 0 FAIL but two PASS were false positives — see CHANGELOG. Fixes (runner-only, zero UI change) FissionState gains targetActivity (resolved ComponentName). F02 resolves launcher activity via PackageManager.getLaunchIntentForPackage(); aborts F03..F10 if none. F05/F09 use 'am start ... -n <pkg/.Activity>' and treat 'unable to resolve' as FAIL/WARN regardless of exit code. F06/F10 use awk to extract the per-task displayId (no more false positives from substring sweeps). F08 scopes mBounds=Rect extraction to the Yandex task block, requires both '(100, 80' and '1820' on the same line. Branch: beta/1.2.0-dilink5. Latest stays v1.0.1. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.46-betav1.2.46-beta — Diag cold-start perf : lazy test rows Field report: the Diagnostic page felt slow to open. Root cause DiagActivity.onCreate() was eagerly inflating the test-row catalogs of all 6 diag panels: Panel Rows Beta Engine 28 DiLink 5 31 DL5 Cluster recon 42 DiLink 2 40 DiLink 4 40 Mirror 10 Total 191 That's 191 row inflations × ~6 findViewById per row on the UI thread, even though only one panel is ever visible at a time. On DL3/DL5 that's ~400–800 ms of bound UI-thread work before the first frame can be drawn. 5 panels out of 6 are pure waste — the typical user opens Diag, looks at one tab, and goes back. Fix Each prepare<X>TestRows() is now wrapped behind a lightweight prepare<X>TestRowsIfNeeded() guard (one boolean flag per panel) and the call moves from onCreate into showPanelForTab(position) — so the catalog is only inflated the first time that panel actually becomes visible. Once prepared, the guard is a no-op, subsequent tab switches stay free. Same pattern already used (since v1.2.42 / v1.2.43) for refreshExportApkListIfNeeded() and onVoicePanelEntered(). Files touched app/build.gradle (303 → 304, 1.2.45-beta → 1.2.46-beta) DiagActivity.java (+6 boolean flags, +6 IfNeeded wrappers, removed 6 eager calls from onCreate, added 6 lazy calls in showPanelForTab) No new permission, no manifest change, no new dependency, no new string, no new layout. Zero regression contract Same rows, same bindings, same Run-All / Copy / Telegram pipelines — only the inflation moment changes. The default tab logic (DL2 → DL4 → DL5 → Beta fallback) is unchanged; whichever tab opens first, its catalog is prepared synchronously inside showPanelForTab before the panel becomes visible. Install Side-load DashCast-v1.2.46-beta-debug.apk over any previous beta (versionCode 304 ≥ all earlier betas). Branch: beta/1.2.0-dilink5 (not merged to main). LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.45-betav1.2.45-beta — Compact apps panel mode Main — new "Mode compact (liste apps étroite)" Settings toggle. Field request: free the left apps column down to a 2-icon-wide grid so the cluster preview pane on the right gets significantly more room (both width and height). Made into a Settings switch so each driver picks the layout they prefer. What changed New Settings toggle in Affichage card: "Mode compact (liste apps étroite)" — PREF_COMPACT_APPS_PANEL, default OFF (zero regression, historical 5-col layout preserved). When ON: Left apps column layout_weight flips from 1.4 → 0.6 rv_apps GridLayoutManager spanCount flips from 5 → 2 (in grid mode) Filter chips row (ll_category_filters) is force-hidden (no longer fits in a 2-icon column) When OFF: full historical layout restored, chips visibility honoured per their own pref. Live apply: switch takes effect immediately on return from Settings (no activity restart, called from MainActivity.onResume). List ↔ Grid toggle in the search bar still honours compact spanCount on re-creation. i18n 2 new strings × 12 locales = 24 entries (settings_compact_apps_panel, settings_compact_apps_panel_support). All locales hand-curated, zero MissingTranslation lint regression. Files touched app/build.gradle (302 → 303, 1.2.44-beta → 1.2.45-beta) SettingsActivity.java (+pref constant, +field, +bind/load/listener) activity_settings.xml (+1 toggle row in Display card) MainActivity.java (+applyCompactAppsPanelMode() ~50 LoC, +onResume call, toggleViewMode honours spanCount) res/values/strings.xml + 11 other locales (+2 keys each) No new permission, no manifest change, no new dependency, no new drawable (reuses ic_aspect_ratio). Zero regression contract The pref defaults to false, so any user upgrading without touching the new toggle sees the exact same layout as v1.2.44. Install Side-load DashCast-v1.2.45-beta-debug.apk over any previous beta (versionCode 303 ≥ all earlier betas; signed with the same BYD platform keystore). Branch: beta/1.2.0-dilink5 (not merged to main). LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.44-betav1.2.44-beta — Hotspot UX consistency + clients fix Four bugs fixed, all reported from the field. Bug 1 — Navrail inconsistency The « Hotspot » entry only appeared on the Main activity navrail. Entering Diag, Sysinfo, Log or Settings made it disappear, breaking the user's mental model of « the navrail is always the same set of icons ». Fix. New helper com.byd.dashcast.NavRailHotspot.apply(activity, viewId, finishOnNav) that replicates the historical gating logic (DL3 + use_own_sim pref, default true since v1.2.38). Each of the 4 secondary layouts gets a new LinearLayout wrapper (nav_hotspot_diag / _log / _sys / _set, visibility="gone" by default, flipped to VISIBLE by the helper when gating passes), and each of the 4 activities calls the helper from its existing wire<Screen>NavRail() method — one line of glue per screen. Bug 2 — Hotspot activity has no navrail at all Entering Hotspot dropped the user into a screen with only a back button, forcing finish-and-relaunch to reach any other screen. Fix. activity_hotspot.xml root rewrapped from a single NestedScrollView to a horizontal LinearLayout with (a) a full navrail on the left (Apps/Settings/Diag/Sysinfo/Log clickable + Hotspot marked active with bg_nav_pill_active + primary tint), and (b) the original 2-col content wrapped in a NestedScrollView with weight=1. New wireHotspotNavRail() method in HotspotActivity wires the 5 other items. Bug 3 — Uptime counter not refreshed in real time The session uptime was only updated when statsTick fired (every 5 s), so the counter visibly jumped 5 seconds at a time. Fix. New independent ticker uptimeTick posted every 1 s, updates only tv_stat_uptime from the locally-tracked upStartElapsed. No ADB call, no dumpsys, no TrafficStats read — pure SystemClock.elapsedRealtime() subtraction. Started in onResume, removed in onPause. The 5 s statsTick is unchanged and still drives Rx/Tx + clients + the session lifecycle. Bug 4 — Connected clients not shown The previous parseClients relied exclusively on dumpsys wifip2p. On the BYD ROM this section is empty (or formatted differently) even when devices are connected, so the user saw « 0 clients » with a phone clearly visible in TetherFi's UI. Fix. The enumeration now combines three independent data sources in a single ADB roundtrip and takes the union of MACs discovered: dumpsys wifip2p — kept for friendly-name harvest (primary). /proc/net/arp — every entry on a p2p-* / p2p* / ap* / softap* / *-ap interface with Flags != 0x0 is treated as authoritative. ip neigh show — same gating, for kernels that surface neighbours only via the ip tool. Lines containing FAILED / INCOMPLETE are dropped. The three sources merge into a LinkedHashMap<mac, HClient>, so dumpsys-derived friendly names win when available and the ARP/neigh fallbacks fill in the rest. Touched files app/build.gradle (301→302) New: NavRailHotspot.java HotspotActivity.java (+nav rail wiring, +1Hz uptime ticker, rewritten client enumeration) DiagActivity.java / LogActivity.java / SysInfoActivity.java / SettingsActivity.java (+1 line each) activity_diag.xml / activity_log.xml / activity_sysinfo.xml / activity_settings.xml (+1 hotspot wrapper each) activity_hotspot.xml (root rewrapped + navrail prepended) No new dependency, no new permission, no new string, no manifest change. Compatibility versionCode 302 — Android accepts the update without uninstall over v1.2.43. Pre-release : « Latest » stays at v1.0.1. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.43-betav1.2.43-beta — Voice (alpha) audio-chain PoC Diagnostic → new « Voice (alpha) » tab. Step 1/3 of the cross-DiLink voice-control roadmap. This release ships an audio-chain validator only — no ML, no wake word, no ASR. The goal is to prove that the microphone reaches the app on DL3/DL4/DL5 before adding the ML dependencies in later releases. Roadmap (3 steps) Version Adds APK delta v1.2.43 Audio chain validator (AudioRecord 16 kHz mono + RMS/peak/clip + VU-meter) +~40 KB v1.2.44 Wake word « Ok DashCast » via openWakeWord (ONNX Runtime Mobile, FOSS Apache-2.0) +~5 MB v1.2.45 Vosk multilingual ASR with on-demand language packs + intent router +~50 MB/lang Why this stack and not Porcupine Porcupine requires a per-user AccessKey, periodic online validation, is limited to ~3 monthly-active-users on the free tier and ships as a closed binary blob — unsuitable for a freely-distributed offline APK. openWakeWord + Vosk + ONNX Runtime Mobile are 100% FOSS (Apache-2.0), 100% offline, no key, no telemetry, no Google Play Services required. What's in this release New « Voice (alpha) » tab in Diagnostic (index 13, after Export APK BYD) Foreground service com.byd.dashcast.voice.VoiceService (channel dashcast_voice_poc, type microphone) AudioRecord at 16 kHz mono 16-bit, source VOICE_RECOGNITION, frames of 800 samples (≈50 ms) Live VU-meter (RMS + instantaneous peak, both 0..32767), stats line RMS X • pic Y • clip Z • frames N, run-time chrono mm:ss RECORD_AUDIO permission requested at runtime, denied → toast + button reverts IPC: LocalBroadcastManager (in-process only, no extra system permission) i18n 100% — 19 new keys × 12 locales = 228 entries (fr/en hand-shipped, ar/be/de/es/it/kk/ru/tr/uk/uz hand-curated) Isolation contract All voice code lives under com.byd.dashcast.voice.* with zero imports from production code (only outside imports = AppLogger and R). Production code is zero-touch — DiagActivity only receives a new tab in append, AndroidManifest only receives a new permission + service, activity_diag.xml only receives a TabItem + <include>. Killing or crashing the voice service has zero impact on the rest of the app. Privacy Nothing is recorded, transmitted or analysed. The audio frames are read, RMS/peak/clip are computed locally in a pure Java loop, broadcast to the UI, and dropped — no buffer is ever persisted to disk, no network call is ever made. Install This is a pre-release. Latest stays at v1.0.1. Install the attached APK over v1.2.42-beta to upgrade — versionCode 301 makes Android accept the update without uninstall. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.42-betaDashCast v1.2.42-beta New Diagnostic tab — Export APK BYD List every installed BYD / XDJA / DiLink / cluster package and ship its APK to Telegram in two taps, with auto-cleanup. No USB cable, no host machine needed for grabbing a BYD APK off the ROM. UI New Export APK BYD tab in Diagnostic (after Cluster DL5) Per-APK row mirroring the Journal look: colored bar + monospace package name + v<name> (<code>) + size + APK path + Exporter button Header card with counters (« X APK détectés • Y MB sur disque ») and Rafraîchir button Hint spelling out the cache-share-auto-delete contract Pipeline Scan: PackageManager.getInstalledPackages(0) filtered on com.byd., com.xdja., com.dilink., plus tokens cluster | automotive | fission | projection | dilink Copy: reads applicationInfo.sourceDir (every /data/app/.../base.apk is mode 0644, no ADB shell needed) Share: ACTION_SEND with MIME application/vnd.android.package-archive via FileProvider, targeted on Telegram (5 package variants probed) with a chooser fallback Auto-cleanup — 3 layers, the car never keeps an APK long-term: Cache wiped on onCreate (orphans from previous session) Cache wiped on Rafraîchir Handler.postDelayed(... 5 min) deletion after each share, with removeCallbacksAndMessages(null) on onDestroy i18n 15 new keys × 12 locales = 180 entries. French (default) + English + ar, be, de, es, it, kk, ru, tr, uk, uz. Hand-curated translations, technical identifiers preserved, %1$s/%2$d placeholders strict. Also shipped — v1.2.41-beta content (unreleased before) DL5 Cluster recon cleanup — R14/R15/R16 rewritten with proper dumpsys platform_compat syntax (the old am compat list <pkg> was interpreted as a change ID and crashed). R17 grep switched from BRE \| to BusyBox-compatible ERE. New Test Fission live battery (F01–F12, DL5 only) targeting Yandex Maps. Enables FORCE_RESIZE_APP (change ID 174042936) per-package via am compat enable, launches on the fission display with am start --display N --windowingMode 5 ..., resizes via cmd activity task resize, moves back to main display via the safe MAIN/LAUNCHER intent (F09/F10), then cleans up (am force-stop + am compat reset). DL5-only enforced; F-tier hidden on DL2/DL3/DL4. Display 0 policy: no resize / no size-mutation command ever, but moving an app TO display 0 via the launcher intent is allowed. Full i18n for the Fission UI strings: 6 keys × 12 locales. Files DashCast-v1.2.42-beta-debug.apk (15 MB) Install adb install -r DashCast-v1.2.42-beta-debug.apk Open Diagnostic → Export APK BYD to try the new tab. Status Pre-release. Latest stable remains v1.0.1. LinksAPK download GitHub release page
-
BYD Song Ultra DM-i to launch on May 28 with up to 310 km EV range
BYD announced that the Song Ultra DM-i will officially launch in China on May 28. The SUV is the plug-in hybrid (PHEV) version of the Song Ultra lineup and adopts BYD’s fifth-generation DM hybrid technology, according to IThome. Official launch information confirms two battery configurations: a 26.6 kWh pack and a larger 38 kWh pack. The corresponding CLTC pure electric range figures are 205 km and 310 km, respectively. The launch will take place on the same day as BYD’s intelligent-driving strategy event, where the automaker is expected to discuss wider deployment of its “God’s Eye” assisted-driving systems. BYD has not officially confirmed whether additional Song Ultra DM-i intelligent-driving functions will be announced during the conference. The Song Ultra DM-i follows the earlier launch of the all-electric Song Ultra EV, which entered the Chinese market in March at prices ranging from 151,900 yuan (21,100 USD) to 179,900 yuan (25,000 USD). Exterior and dimensions BYD’s official preview images show the Song Ultra DM-i retaining the same overall styling language as the Song Ultra EV. Earlier teaser material indicated the PHEV variant would remain visually close to the battery-electric model. Official specifications list the SUV at 4,850 mm long, 1,910 mm wide, and 1,670 mm tall, with a wheelbase of 2,840 mm. Interior and equipment Dealer and official preview material indicate the interior follows the same general layout as the Song Ultra EV. The cabin adopts a minimalist dashboard design centred around a floating 15.6-inch infotainment display. Officially confirmed standard equipment includes four-zone voice interaction and wireless phone charging. Dealer-reported features also indicate availability of a powered front trunk with knock-gesture unlocking functionality, ventilated, heated, and massage-enabled front seats, and a “Queen” front passenger seat configuration. Some premium equipment appears expected to carry over from the Song Ultra EV lineup, including a built-in refrigerator and DiSound audio system. However, BYD has not officially confirmed whether all EV-grade interior equipment will remain identical on the DM-i variant. ADAS and intelligent driving The Song Ultra DM-i can be equipped with a lidar-based “God’s Eye” intelligent-driving package. BYD states that the system uses 27 sensors and supports navigation-assisted driving functions for urban and highway scenarios, as well as intelligent parking-assistance. Earlier EV-family information indicated support for narrow-lane passage functions and autonomous U-turn capability. However, BYD has not confirmed whether every previously disclosed EV-system function will carry over unchanged to the DM-i version. The May 28 strategy event follows recent disclosures by BYD regarding the large-scale deployment of its assisted-driving technologies. During an industry conference in Shanghai, BYD stated that vehicles equipped with its assisted-driving systems had cumulatively surpassed 3 million units. Company executives also claimed the severe accident rate for equipped vehicles had fallen to one-sixth that of conventional vehicles. Powertrain The Song Ultra DM-i uses BYD’s fifth-generation DM hybrid system, combining a 1.5-litre naturally aspirated gasoline engine with an electric motor. Official specifications list the gasoline engine at 74 kW and the drive motor at 175 kW. BYD confirmed two battery options: 26.6 kWh battery with 205 km CLTC electric range 38 kWh battery with 310 km CLTC electric range BYD Song L DM-i sales in China. Credit: China EV China Tracker Market context The Song Ultra DM-i enters China’s competitive SUV market as BYD continues expanding its long-range plug-in hybrid lineup. Domestic sales of the BYD Song L DM-i, another SUV within BYD’s hybrid lineup, reached 4,720 units in April 2026, down 15.4% month-on-month and 54.4% year-on-year. Earlier monthly sales peaked at 17,690 units in June 2025, according to China EV China Tracker. The launch also follows several recent Song Ultra-related campaigns by BYD. Earlier this month, the company launched a 4,244 km cross-China drive event for the Song Ultra EV while promoting expansion of its Flash charging network to 5,979 stations across China. BYD also previously stated that the Song Ultra EV recorded 61,240 unit sales within a month of launch. BYD BYD Song Ultra DM-i to launch on May 28 with up to 310 km EV range.
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.40-betav1.2.40-beta — Critical recon bug fix: R17 was killing DashCast mid-suite Pre-release. One critical fix. 🐛 The bug DL5 tester running v1.2.39-beta recon-v2 reported: « À un moment l'écran flash et ça sort de DashCast pour revenir. Du coup le résultat est perdu et la personne ne peut pas exporter le log. » 🔍 Root cause R17 was implemented in v1.2.38-beta as: am compat reset 174042936 com.byd.dashcast 2>&1 intended as an idempotent no-op probe (no override set → reset is a no-op). The flaw: on Android 11+, the platform_compat service forces a full process restart of the target package on every compat-override mutation, including a reset that resolves to a no-op. This is by design — compat changes are evaluated at Application.onCreate, so the platform recycles the process to guarantee the new value takes effect on next launch. Net effect on DL5: R17 called am compat reset against our own package → platform killed DashCast → DiagActivity recreated → in-memory recon results wiped → tester left with nothing to copy or send via Telegram. ✅ Fix R17 is now a fully read-only probe: dumpsys platform_compat 2>&1 | grep -B1 -A1 '174042936|FORCE_RESIZE_APP' | head -30 Surfaces the same registered metadata of change ID 174042936 (registered? overridable? default state? min sdk?) without touching the override state of any package → zero process kill, zero side effect. 🔒 Audit No other test in the catalog mutates state: R13 (am compat enable no args) → usage hint only R14–R16 (am compat list <pkg>) → read-back R18 (dumpsys platform_compat | grep) → read-only R01–R12, R19–R30 → pure dumpsys / settings get / pm dump / getprop / etc. So R17 was the ONLY suite-killing test. After this fix the suite runs end-to-end every time and the report can be copied / shared via Telegram normally. Build versionCode 298 / versionName 1.2.40-beta Branch: beta/1.2.0-dilink5 Touched: app/build.gradle, Dl5ClusterReconRunner.java (R17 dispatcher + catalog description). No new permission, no string change, no layout change, no dependency, no protocol bump. Zero regression on any other platform — recon tab is DL5-only and the change is a pure command swap in a single test case. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.39-betav1.2.39-beta — Hotspot icon visible by default on DL3 + no auto-projection on app launch Pre-release. Two field-reported UX fixes. 🐛 Fix A — Hotspot icon missing on DL3 navrail A DL3 user reported the Hotspot icon never appeared in the left navigation rail. Root cause: refreshNavHotspot() read getBoolean(PREF_USE_OWN_SIM, false) — the false default meant new DL3 users had to discover and tick the "I use my own SIM card" toggle in Settings before the icon would show up. Fix: default flipped to true. On DL3 the Hotspot navrail entry now appears immediately on first launch. Users without a personal SIM can still hide it via the same Settings toggle (checkbox + support text unchanged). ⚙ Fix B — No more auto-projection on app launch User request (verbatim): « Je ne souhaite pas que la projection s'active automatiquement quand on lance l'application. Vu qu'on lance la projection automatiquement quand on lance une application c'est suffisant. Il faut juste s'assurer que le slow path et le fast path soit bien gardé. » Since v1.2.77 (a long-standing behaviour), opening DashCast unconditionally called activateCluster() in onStart(). This woke the cluster surface even when the user only opened the app to browse Settings, view SysInfo, or check for OTA updates. Fix: the else { activateCluster(); } branch in MainActivity.onStart() is removed. Both projection auto-start paths in the actual app-launch flow are preserved untouched: Slow path — onSendToDashboard() → mClusterService == null → mPendingAppAfterActivation = app ; activateCluster() → service-connected callback replays the tapped app once displayId > 0. Fast path — onSendToDashboard() → service already bound, displayId > 0 → direct moveTaskToDisplay() / launchOnDashboard(). So tapping any app in the grid still kicks projection automatically (exactly like before). The only thing removed is the gratuitous cluster wake-up when DashCast is opened without launching an app. The if (ClusterService.sIsRunning) branch is preserved: an already-running service still gets re-bound when the Activity returns to foreground. Behavioural contract Cold open (no projection) → land on app grid, status pill "OFF", zero shell calls fired. Like opening any launcher. Tap any app in the grid → projection auto-activates (slow path), app replayed once cluster is up. Open DashCast while projection is already running → bind and re-attach listener. No regression. Build versionCode 297 / versionName 1.2.39-beta Branch: beta/1.2.0-dilink5 Touched: app/build.gradle, MainActivity.java (2 small edits). No new permission, no string change, no layout change, no dependency, no protocol bump. Zero behavioural regression on DL2/DL4/DL5 — Hotspot gate is still platform-gated on isDiLink3 and the auto-activation removal applies uniformly per the user's clarification. LinksAPK download GitHub release page
-
DashCast — BYD Cluster Launcher & Mirror
DashCast v1.2.38-betav1.2.38-beta — UpdateChecker loop fix + Recon-v2 Pre-release. Branch: beta/1.2.0-dilink5. Two field-reported bug fixes. 🐛 Bug A — UpdateChecker infinite-prompt loop on v1.2.37-beta Symptom (reported by multiple users): v1.2.37-beta installs correctly, but on every next launch the OTA banner re-proposes installing v1.2.37-beta itself. Tap "Install" → install completes → next launch → banner again. Infinite loop. Root cause in UpdateChecker.isNewer(latest, currentName, currentCode): the helper stripped the -beta / -buildN suffix from latest before calling parseVer(...), but NOT from currentName. So parseVer("1.2.37-beta") → split(".") → ["1","2","37-beta"] → Integer.parseInt("37-beta") throws → segment silently stays 0 → current = [1,2,0] vs latest = [1,2,37] → loop reports 37 > 0 = true → "update available" forever. Fix (1 line): apply stripSuffix(...) to currentName too, mirroring exactly what's done for latest. Also tightened the equality fall-through to explicitly return false when both base versions match and no -buildN suffix is available. Impact: every v1.2.37-beta user, on first launch with v1.2.38-beta, sees one final correct update prompt → installs → never re-prompted for the same version again. v1.2.36-beta and earlier are unaffected. 🛠 Bug B — Recon-v2 (8 fixes in the DL5 Cluster Recon tab) Field log log/byd_report_20260525_105105.log from the DL5 tester (Yandex Maps on cluster) running v1.2.37-beta recon-v1 revealed 8 bugs in Dl5ClusterReconRunner.java. All fixed: # Test Bug Fix 1 R01 Platform.describeMode(null) NPE pass Context through 2 R02 last-match overwrite picks id=4 break after first match 3 R02 + R25 hidden Display Id=2 not enumerated dumpsys-based fallback enumerates every Display Id=N the platform sees, including hidden ones 4 R03 required token "uid=2000" doesn't match id -u output "2000" required tokens changed to "2000" + "shell" 5 R13 am compat --help rejected on DL5 (no --help verb) now am compat enable 2>&1 | head -40 (triggers usage hint) 6 R14 am compat list needs a package argument now am compat list <ourPackage> 7 R15–R18 am compat get is NOT a valid AOSP verb on DL5 (rejected with Invalid toggle value: 'get') R15/R16: am compat list <yandexmaps/waze>; R17: am compat reset 174042936 <ourPackage> (idempotent); R18: dumpsys platform_compat | grep cross-check 8 R23 grep matches mGlobalConfig noise on every Configuration grep -v mGlobalConfig pre-filter + anchored task-stanza grep 9 R26–R28 grep matches <supports-screens> resizeable instead of activity-level resizeableActivity grep narrowed to resizeMode|resizeableActivity|maxAspectRatio|launchMode|targetSdk Key discovery (catalog now documents it): the DL5 platform_compat shell exposes ONLY enable | disable | reset | reset-all | list (no get verb). Read-back is done via am compat list <pkg>. Why hidden Display Id=2 matters: DL5 hides the physical cluster display from DisplayManager.getDisplays() for non-system uids. Only the containerservice-owned virtual proxies shared_fission_bg_XDJAScreenProjection_0/1 (ids 3 and 4) are exposed. The cluster framebuffer itself is id=2 and is only visible via dumpsys headers. R02 now reports both views; R25 geometry probes every id, not just heuristic name matches. ⚠ Not in this release (deferred to v1.2.39+) Live FORCE_RESIZE_APP wire-up — still gated on a clean recon-v2 run from at least one DL5 user confirming the change ID is enablable. Isolated live-test panel (Enable / Test launch / Reset buttons). Build versionCode 296 / versionName 1.2.38-beta Branch: beta/1.2.0-dilink5 No new permission, no manifest change, no new dependency, no protocol bump. LinksAPK download GitHub release page
-
BYD files sulfide solid‑state battery patent as China targets 2027 pilot production
BYD has filed a new patent for a composite solid electrolyte membrane used in solid-state batteries, adding to a broader wave of sulfide solid-state battery development across China’s battery industry, reported by Sina. According to patent filing CN121983643A published by China’s National Intellectual Property Administration, the patent covers a “composite solid electrolyte membrane and its preparation method, solid-state battery, battery pack and electrical device.” BYD solid-state battery patent The patent describes a composite electrolyte structure comprising multiple inorganic solid electrolyte particles combined with a polymer electrolyte fibre network coating. The inorganic electrolyte section includes both smaller and larger particles. The polymer electrolyte comprises a polymer matrix and a lithium salt, with the material wrapped around portions of the inorganic electrolyte surface in a fibre network. The filing states the structure is intended to improve ionic conductivity and mechanical strength of the electrolyte membrane. The document does not disclose energy density figures, charging performance, cycle life data, manufacturing cost targets, or commercialisation timing. The patent also does not discuss lithium-metal anodes, vehicle-level integration, or pack-pressure management systems commonly associated with sulfide all-solid-state battery architectures. BYD chief scientist outlines bottlenecks In April 2026, BYD chief scientist Lian Yubo said the company’s all-solid-state battery development had entered a “critical breakthrough stage,” while commercialisation remained constrained by engineering complexity, cost control, and production yield challenges. Lian identified solid-solid interfacial stability and lithium dendrite suppression as core technical bottlenecks. He also stated the industry should focus on full-chain system development rather than only optimising individual battery cells. Earlier disclosures from BYD referenced a pilot-scale deployment around 2027, alongside the development of third-generation sodium-ion batteries targeting 10,000 charging cycles. China’s solid-state battery competition BYD’s latest filing comes as multiple Chinese battery makers move toward larger-capacity solid-state prototypes and pilot lines. In March, CALB presented a 60 Ah all-solid-state battery prototype with energy density exceeding 450 Wh/kg. Chery also disclosed the development of a 60 Ah all-solid-state battery with an energy density of 400 Wh/kg and vehicle integration testing planned for 2027. CATL has also disclosed sulfide-based solid-state battery patents and pilot production targets around 2027. GAC previously stated its automotive-grade solid-state cells above 60 Ah had entered small-batch production for validation testing. Battery Installation Volume for EVs BYD’s EV battery installation volume in China. Credit: China EV DataTracker Battery installation volumes According to China EV DataTracker data, battery installation data for 2025 and 2026 showed that BYD remained concentrated in LFP battery deployments during the period. BYD battery installation volume reached 10.49 GWh in April 2026 with a 16.8% market share, compared with 12.84 GWh and 22.5% share in May 2025. The reported installation mix during the listed months consisted entirely of LFP batteries.