Skip to content
View in the app

A better way to browse. Learn more.

Firmware, Software & Manuals for BYD Owners

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Vitaly

Administrators
  • Joined

  • Last visited

Everything posted by Vitaly

  1. 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
  2. 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
  3. 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
  4. Компания 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)
  5. 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
  6. 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
  7. 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.
  8. 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.
  9. 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.
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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.
  19. 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
  20. 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
  21. 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
  22. 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.
  23. DashCast v1.2.37-betav1.2.37-beta — DL5 Cluster Recon tab + Telegram one-tap export A targeted release for the DiLink 5 tester whose Yandex Maps cluster resize broke after v1.2.35 reverted force_resizable_activities. This release ships only the recon tooling needed to validate the next fix in production conditions before wiring any live cluster operation. Why a recon-only release The DL5 resize regression has a clear suspected fix — the AOSP per-app compat override am compat enable FORCE_RESIZE_APP <pkg> (change ID 174042936) — but we need empirical confirmation that the compat framework shell surface is actually exposed on production BYD ROMs before putting any new live code path in front of users. To do that without burning hours of in-car tests, the tester now has a dedicated diag tab that runs 30 non-destructive probes and ships the full report back via Telegram in a single tap. New "Cluster DL5" diagnostic tab Renamed: the existing "Cluster" tab is now "Cluster DL3" (purely cosmetic, the underlying panel panel_cluster_poc is unchanged). New tab "Cluster DL5" at the end of the tab strip (index 11), with a Material 3 card UI: header (ic_science icon + title + subtitle), platform pill, live counters, three action buttons (Run recon / Copy report / Send via Telegram), and a programmatic test list. No live cluster operation in this release — every test is read-only. 30 recon tests R01–R05 Platform identity: Build.MODEL, Build.PRODUCT, Build.FINGERPRINT, DisplayManager inventory (cluster auto-detection by name match on fission|xdja|cluster|virtual), ADB local uid probe, SELinux enforce mode, cluster apps installed scan (Yandex Maps, Google Maps, Waze, Sygic, TomTom). R06–R12 Shell verb surface: full --help capture of am, am start, cmd activity, cmd activity task, wm, cmd window, cmd display — so we know exactly which --display, --windowingMode, resize, set-ignore-orientation-request flags are honoured on this ROM. R13–R18 Compat framework — the critical block. am compat --help, am compat list first 60 entries, then targeted am compat get against FORCE_RESIZE_APP, 174042936 (numeric), NEVER_SANDBOX_DISPLAY_APIS, OVERRIDE_MIN_ASPECT_RATIO, all scoped to our own package. R19–R23 Settings + dumpsys snapshots: force_resizable_activities current value, settings list global filtered on resizable|freeform|multi|sandbox|ignore_orientation, dumpsys window/display/activity keyword filters. R24–R25 wm size/wm density on default display and on the detected cluster display. R26–R28 Per-app manifest probe via pm dump <pkg> | grep -E 'resizeable|maxAspectRatio|launchMode|targetSdk' for Yandex Maps, Google Maps, Waze (auto-SKIP when not installed). R29 Service list filter for auto_container|cluster|fission|xdja|window|activity_task. R30 getprop filter for resizable|freeform|multi|sandbox|cluster|dilink|fission|xdja. Total run: < 20 s typical (single-threaded executor, 6 s per-probe timeout). Telegram one-tap export New helper AppLogger.shareReportToTelegram(Context, String): Probes 5 Telegram package names in order (org.telegram.messenger, org.telegram.messenger.web, org.telegram.plus, nekox.messenger, org.thunderdog.challegram). On hit, fires a direct ACTION_SEND with setPackage(hit) + FileProvider URI on a byd_report_*.log containing the recon report and the in-memory AppLogger ringbuffer (so we get both the structured probe results and the raw lifecycle log). Three-level fallback: TG-found → direct intent; no-TG → generic share chooser; no-file → text-only chooser. The new "Send via Telegram" button in the Cluster DL5 panel wires straight to this helper — no manual file-picking, no submenu hunting. Next step (v1.2.38) Once the tester runs the recon and ships the report, we will: Confirm am compat list contains FORCE_RESIZE_APP (or 174042936) accessible from the app uid 2000 shell. Wire the per-app fix into ClusterService.startActivityViaShell (chain am compat enable 174042936 <pkg> ; am force-stop <pkg> ; am start --display N --windowingMode 5 ...). Remove the now-unneeded global force_resizable_activities toggle that v1.2.35 reverted, since the per-app override has no system-wide side effect. Touched files app/build.gradle — 294 → 295, 1.2.36-beta → 1.2.37-beta. New dilink5/Dl5ClusterReconRunner.java (~380 LoC, reuses DiLink5TestRunner.TestDef/TestResult/Status/Listener types for row rendering reuse). New res/layout/include_diag_cluster_dl5.xml (~140 LoC, Material 3 card + action row + programmatic test list). AppLogger.java — added shareReportToTelegram (~65 LoC). DiagActivity.java — new TAB_CLUSTER_DL5 = 11, new fields, new methods bindClusterDl5Panel / prepareClusterDl5TestRows / runClusterDl5AllTests / updateClusterDl5Counters / copyClusterDl5Report / sendClusterDl5ToTelegram (~110 LoC). Row binder reused from existing bindDl5Row. res/layout/activity_diag.xml — new tab + new include. res/values/strings.xml + res/values-en/strings.xml — 1 renamed (diag_tab_cluster Cluster → Cluster DL3) + 15 new keys. Compatibility No new permission, no manifest change, no new dependency, no protocol bump. Zero behavioural regression on DL2 / DL3 / DL4 / DL5 production paths — the new tab is purely diagnostic; the rename Cluster → Cluster DL3 is cosmetic and does not affect any code path. Channel Pre-release on beta/1.2.0-dilink5. Not merged to main. Latest stable remains v1.0.1 on GitHub. LinksAPK download GitHub release page
  24. DashCast v1.2.36-betaDashCast v1.2.36-beta — TetherFi Hotspot integration (build 294) Pre-release. Not for daily-driver yet — only the hotspot subsystem changed; everything else is identical to v1.2.35-beta. Highlights Full Hotspot screen redesign built around the open-source TetherFi proxy (no carrier tether quota, no BYD MIUI tether restrictions). Live traffic stats (uptime / RX / TX) sampled every 5 s without root. Connected clients list populated from dumpsys wifip2p + /proc/net/arp via the on-device ADB shell proxy. One-shot TetherFi update checker that pings GitHub Releases at boot and surfaces an "Update available" badge on the hotspot card. What's new in detail Hotspot UI (activity_hotspot.xml) New landscape-first 2-column layout matching the project mockup. Left column — Hero card: large status pill (running / stopped / unknown), update-available badge, primary actions (Start / Stop / Toggle / Open TetherFi). Right column — three stacked cards: Clients & traffic — connected-client count pill, scrollable client rows (icon + friendly name + IPv4), live uptime / RX / TX counters. Watchdog — auto-restart switch (decoupled from stats sampling so stats keep working when the watchdog is OFF). Autostart on boot — toggle persisted in SharedPreferences and consumed by BootReceiver. New drawables: bg_hero_icon, bg_side_icon, bg_count_pill, ic_devices, ic_monitor_heart, ic_wifi_tethering, ic_sim_card. TetherFi integration (HotspotActivity.java) Single supported entry point: com.pyamsoft.tetherfi/.activity.ProxyTileActivity with key_action ∈ START / STOP / TOGGLE. No reflection, no private APIs. Independent stats probe (statsTick, 5 s period) probes dumpsys activity services com.pyamsoft.tetherfi | grep ProxyForegroundService via the local ADB client. Watchdog and stats now run on separate cadences. Session lifecycle (onProbeTransition): DOWN → UP : snapshot SystemClock.elapsedRealtime() + TetherFi UID + RX/TX baselines from TrafficStats.getUidRxBytes / getUidTxBytes. UP → DOWN : reset all counters to -1 and clear the clients list. TetherFi UID resolved once via PackageManager and cached for the activity lifetime. Format helpers: formatUptime(ms) → Hh Mm Ss, formatBytes(b) → B / KB / MB / GB, friendlyMacName(mac) → Device …XX:XX fallback. Stats handler properly torn down on onPause (no callbacks leak). Connected clients enumeration New combined ADB shell payload: dumpsys wifip2p 2>/dev/null; echo '===ARP==='; cat /proc/net/arp 2>/dev/null. Static parseClients(String) splits on the separator, builds a MAC → IPv4 map from arp, then walks the wifip2p dump looking for client sections (Client list, mClients, clients:, wifip2pdevice lines) and pairs each MAC with the nearest deviceName= token. Static inner type HClient { mac, name, ip } + regex P_MAC / P_NAME. renderClients(List<HClient>) updates tv_clients_count, repopulates ll_clients_list via buildClientRow(c) (programmatic LinearLayout with an ic_devices icon, name TextView weight=1, monospace IP TextView), and toggles tv_clients_empty. Per-client RX/TX is intentionally not shown — kernel does not expose per-MAC counters without root. TetherFi update checker (TetherFiUpdateChecker.java) Background HEAD/JSON probe against the TetherFi GitHub Releases API at boot. Compares installed APK version (PackageManager.getPackageInfo) against tag_name. Result cached in SharedPreferences; the hotspot card reads it on resume and shows the Update available badge with a link button. Pure best-effort: any network failure / parse failure is swallowed silently. Boot autostart (BootReceiver.java) New autostart path triggered by the existing BOOT_COMPLETED receiver: when the new pref hotspot_autostart_on_boot is true, fire ProxyTileActivity with key_action=START as part of the existing boot fan-out. Also kicks TetherFiUpdateChecker once. Strings (values/strings.xml + values-en/strings.xml) 40+ new strings for the redesigned hotspot screen (titles, empty states, stats labels, update-available copy). Both fr (default) and en localized. Misc MainActivity / SettingsActivity / activity_main.xml / activity_settings.xml: small wiring tweaks to surface the hotspot entry point with the new card style. Platform.java: minor helper added for the hotspot card. versionCode 294, versionName 1.2.36-beta. Known limitations Per-client bandwidth: not supported (root required to read iptables per-MAC counters). Client list only shows devices currently in the ARP table — peers without recent IP traffic may briefly be missing. Update checker requires internet on the head unit at boot; otherwise the badge appears on the next app launch with connectivity. Install Sideload DashCast-v1.2.36-beta-debug.apk. Platform-signed; no uninstall needed when upgrading from v1.2.35-beta. LinksAPK download GitHub release page
  25. A one-off Denza Z9 GT, created jointly by BYD and Swiss luxury watch and jewellery brand Chopard, sold for 700,000 euros, approximately 5.53 million yuan (815,000 USD), at the 32nd Cannes amfAR charity gala in France, announced by BYD. The proceeds from the auction will support AIDS research programs. Denza Z9 GT Chopard edition The customised shooting brake was presented during the Cannes Film Festival activities in Antibes, France, and was described by BYD as a globally unique build created specifically for the charity auction. The vehicle received exclusive gold exterior accents and a redesigned interior inspired by Chopard jewellery craftsmanship. The cabin includes amethyst-themed trim pieces, gemstone-style physical controls, customised embroidery featuring Chopard’s “C” logo, branded wireless charging surfaces, and a dedicated infotainment interface theme. The collaboration also included matching “His & Hers” luxury watches and a custom luggage collection. BYD executive vice president Li Ke said the project combined automotive technology and luxury craftsmanship while supporting fundraising efforts at the amfAR gala. Chopard co-president and artistic director Caroline Scheufele described the vehicle as a jewellery-inspired interpretation of the Z9GT platform. Denza Z9 GT technology The standard Denza Z9 GT officially entered customer deliveries in March. In China, the model is priced between 269,800 yuan and 369,800 yuan (39,000 USD to 53,500 USD). The Z9 GT is among the first production vehicles equipped with BYD’s second-generation Blade Battery and flash charging technology. Previous demonstrations also showed the model participating in BYD’s DiSus intelligent body control system showcases during recent SUV technology events involving multiple Chinese automakers. Earlier this month, a Denza Z9 GT owner in China disclosed that replacing the vehicle’s Blade Battery 2.0 pack would cost less than 11,600 USD, according to a dealership quotation. In April, BYD also announced plans to deploy 6,000 overseas flash chargers while expanding Denza operations in Europe with the Z9GT and D9 models. Denza Z9 GT sales in China. Credit: China EV DataTracker High-value BYD vehicle sales The Cannes charity auction is among several recent high-value BYD vehicle transactions disclosed publicly in 2026. In April, BYD confirmed that the Yangwang U9 Xtreme electric supercar sold for more than 20 million yuan (2.76 million USD) during the 2026 Beijing Auto Show, becoming the highest-priced BYD vehicle transaction publicly disclosed to date. The Denza Z9GT Chopard edition, therefore, ranks below the Yangwang U9 Xtreme transaction in publicly disclosed BYD vehicle sales value, while remaining one of the company’s highest-profile international charity auction appearances. Denza Z9GT sales According to China EV DataTracker, the Denza Z9 GT recorded 3,969 domestic sales in April 2026, up from 712 units in March and 154 units in February. The model accounted for 37.3% of Denza brand sales in April. The Z9 GT previously recorded monthly sales of 744 units in May 2025 and reached 855 units in August 2025 before declining later in the year. Customised Denza Z9GT features Chopard-inspired gemstone interior accents and gold trim. Updated: 25/05/2026 3:33 China time

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.