能量回收知识库 · 总索引

小米智能座舱 MiCarSettings ·「驾驶偏好」页 →「能量回收强度」自定义滑块全解 代码基线:fuben23_micarsettings/MiCarSettings @ rls-xcd-u-mp-26-v7.0 (HEAD e8b5a7ba5 = 修复 V3/PS4 内容,同一 Change-Id I4a34b69c3943fb0574e6fca89b181850db0e766e,Gerrit dev=387202 / rls=387204; 修复前基底 f63fe1cdc;本地 dev 分支同内容 commit 470f9eaaa) 仓库路径:/home/zbc/car/fuben23_micarsettings/MiCarSettings ⚠️ 该仓 controller 大量是 Kotlin(.kt),检索必须同时覆盖 .java 和 .kt (纯 java grep 会漏一半,已踩过的坑) 建立日期:2026-10-13(同日完成 V1→V3 三轮修复史增量更新)

这个功能是什么(30 秒版)

设置 → 驾驶偏好 →「能量回收强度」:一排预设档 Tab(柔和 / 适中 / 标准 / 自定义), 选中「自定义」后下方出现一条 0~100 的滑块,用户随手拖出任意回收强度, 数值实时下发车控属性 ENERGY_REGENERATION_LEVEL。

它有三个容易被忽视的设计点,也是历史问题的全部来源:

  1. 双语义滑块(2026-10-13 产品最终裁决口径):拖动 = 跟手逐值下发、松手停原值; 点击轨道 = 吸附到最近 10 的倍数(half-up,余数 ≥5 进位,Normal 主题;贴 thumb ±1 点击也必须取整)——后者是产品需求,见 N801PROB-86420(已关单 By Design, 问题原因字段原话:「整十吸附是需求」);GT 主题点击不生效(仅按压动画), 取整彻底关闭。
  2. 同一套滑块代码挂在三个页面(驾驶偏好主页 / M1 自定义页 / 主驾自定义页), 但 GT(mach)车型上后两个页面的能量回收项被车型门控移除,GT 只有主页一个滑块。
  3. 取整改写的值必须先让 UI 可见地跳过去,且计数/刷新时序必须正确,2026-07 的 N801PROB-132401 就是「值被静默改写 + 标签滞留旧值」——修复(同一 Change-Id, dev=387202 / rls=387204)历经 V1(标签参数化+同值过滤+==1 门)→ 提测回归(计数 后置被下发覆盖,连续拖动松手也被取整)→ V2(PS3:计数前置+先 setValue 消泄漏帧)→ V3(PS4:GT 加 isIgnoreClick 门关取整,治第三轮「点击抖动」) 四轮演进才收敛, 全部内容就是守住这条时序、触发面与主题门(完整史见 05 篇 §9)。

文档导航

篇目适合谁内容
01-功能与页面结构新手需求全景、三处页面拓扑与 XML 挂载、三道门控(可见/可用/车型)、值映射恒等
02-手势语义与取整机制进阶 · 核心篇拖动/点击/摸 thumb 三手势状态机、取整判定表(修复前后对比)、half-up 公式推导、「先回调后 setValue」时序、语音路径
03-源码精讲进阶SliderPreference / MiCarIconSeekBarPreference / BaseVehicleProgressPrefController 逐段拆解
04-信号链路与下游消费深入ENERGY_REGENERATION_LEVEL 下发链路、BatteryHandler/MIoT、雷达图数据源
05-排障实战-N801PROB-132401排查问题「数值标签滞留」完整复盘:bugreport 三视角对账 + 视频帧取证;§9 三轮修复史(V1→回归→V2→GT 抖动→V3)+ 产品裁决
06-台架mock配方与测试矩阵测试/自测VHAL mock 三信号、手势注入、取整边界用例表
07-速查卡所有人propId/常量/文件清单/adb 命令一页纸
08-GT主题slider视觉触摸错位调查进阶 · 组件库GT 委托触摸 anchor(8dp)与视觉行程(154dp pill)两套几何脱钩 ~96px 错位;组件库反编译实证

05 篇的分析素材同源于:/home/zbc/下载/test/车机JIRA/jira-data/N801PROB-132401/analysis/root-cause.md (含 bugreport 逐值对账表与视频 zoom 帧锚点)。

人类学习路线

flowchart LR
    A["01 功能与页面结构<br/>知道它是什么、在哪、谁能看见"] --> B["02 手势语义与取整机制<br/>知道拖/点/摸各是什么下场"]
    B --> C["03 源码精讲<br/>要改代码看这"]
    C --> D["04 信号链路与下游<br/>值去哪了看这"]
    D --> E["05 排障实战<br/>有单看这"]
    F["06 mock 配方"] -.自测.-> C
    G["07 速查卡"] -.贯穿.-> A & B & C & D & E
    H["08 GT 错位调查"] -.GT 主题/组件库问题.-> C
  • 只想了解功能/排查「不显示、置灰」:01 即可
  • 分析「数值不一致、取整、跳变」类问题:02 + 05 + 07
  • 要改滑块行为(取整粒度、触发面、文案):02 → 03,改完按 06 自测

AI 使用指引

你要干什么必读
分析「能量回收 / 滑块 / 取整 / 数值不一致 / 置灰 / 不显示」类问题单先读 07 速查卡 + 05 案例,再按 01 的门控链核对车型与信号
修改任何相关代码(SliderPreference、三个 controller、XML)必读 02 + 03;02 的判定表和时序图是回归高发区
核对 propId / 枚举值 / 门控条件01 §4、§5 与本文「关键数字一页纸」,全部 javap/源码实证
GT 主题滑块「点不准/摸到变点击/视觉与触摸对不上」类问题08 篇(组件库反编译实证,含 96px 错位公式 Δ(f)=135−138·f dp)

三条纪律:

  1. 本 KB 所有 file:line 均以 rls-xcd-u-mp-26-v7.0 为基线;在 dev 等其他分支上核对时 行号可能有 13 行漂移(dev 与 rls 的 SliderPreference.java 就差 13 行),以符号定位为准。
  2. 「按下 thumb 瞬间的同值回调」已由组件库反编译澄清(08 篇 §3):GT IconSlider 在 ignoreClick=true 时 DOWN 被 computeTouchOffset 精确平移到当前值,|Δ|<1e-4 门 不派发;实际观测到的「同值回调」真身是 DOWN 后微抖 MOVE 的 float 变值 / int 同值 回调——Settings 侧按 int 值计数过滤的修复(387202/387204)对此精确有效。
  3. 分析线上截图/日志时先确认 ROM 所带 settings 版本是否含本修复 (同一 Change-Id I4a34b69c3943fb0574e6fca89b181850db0e766e,Gerrit dev=387202 / rls=387204,当前 PS4=V3,查询时点 2026-10-13 均 NEW 未合入;rls 本地 commit e8b5a7ba5)。注意 V1(PS1/PS2 内容)自身带「连续拖动松手被取整」回归, 只有 V2(PS3)起才可用;GT 主题验收必须以 V3(PS4)为准。

关键数字一页纸

propId 三件套(javap 实证 vehicle.support-0.11.58-SNAPSHOT.jar;App 侧常量定义在 base/settingsBaseLib/.../vehicle/MiCarPropertyIds.java:993-997):

语义常量propId取值
档位(预设/自定义)Energy.REGENERATION_MODE(App 别名 DrivingCtrl.BRAKING_MODE)1631617312 = 0x61408120柔和 SOFT=1、适中 MODERATE=4、标准 STANDARD=2、自定义 ADVANCED=3
自定义强度Driving.ENERGY_REGENERATION_LEVEL1631614333 = 0x6140757dINT32,0100(主自定义页 1100)
禁用原因Driving.ENERGY_REGENERATION_BAN_REASON1631614331 = 0x6140757b0=NO_INHIBIT 可用;1 战斗/2 湿滑(雪地)/3 ADAS/4 除锈/5 陡坡缓降/6 防晕车/7 拖挂

取整机制(SliderPreference.java,rls HEAD e8b5a7ba5 行号,V3 最终态):

  • 判定门(:345-346,三条件缺一不可):mIsRoundUpWhenClick && !slider.isIgnoreClick() && mProgressChangeTimes == MAX_PROGRESS_CHANGE_TIMES(=1,:81)—— 恰好 1 次真实 int 变化、且组件库非 ignoreClick(GT 主题强制 true,一律不取整); 修复前(f63fe1cdc :327)为 <= 1 且无 isIgnoreClick 维度
  • 计数规则:先计数、后下发(:229-231 在 :234 门之前;置后会被下发链覆盖 mSliderValue 致计数恒 1 = V1 回归,05 篇 §9.2);同值回调不计数
  • 公式:v/10*10 + (v%10 >= 5 ? 10 : 0)(:347-349),即 half-up:67→70、33→30、45→50、44→40
  • 粒度:mRoundUpStep = 10(:143),三个 controller 均未改默认值
  • 时序:取整命中后先 slider.setValue(:357)再手动回调刷新(:360),无原值泄漏帧

页面拓扑(详见 01 篇):

页面XML keyController存在条件
驾驶偏好主页pk_settings_driving_braking_strengthBrakingStrengthPreferenceController.java所有车型,档位=自定义时可见
M1 自定义页(Lux/Mann)pk_settings_driving_custom_energy_recovery_strengthCustomEnergyRecoveryStrengthController.kt仅 Lux/Mann(isLuxOrMann())
主驾自定义页pk_settings_driving_main_custom_energy_recovery_strengthMainCustomEnergyRecoveryStrengthController.kt主驾自定义模式入口进入

关联知识库

  • 05-车辆接口层与IPC —— CarProperty 读写/binder 链路, 本功能 setVehicleProperty 同步下发的底层(车技车设根目录)
  • 00-蜂窝网络-README.md —— 同风格知识库示例;蜂窝库的「平台受理/执行分离」认知同样适用于本功能的信号下发