能量回收知识库 · 总索引
小米智能座舱 MiCarSettings ·「驾驶偏好」页 →「能量回收强度」自定义滑块全解 代码基线:
fuben23_micarsettings/MiCarSettings@rls-xcd-u-mp-26-v7.0(HEADe8b5a7ba5= 修复 V3/PS4 内容,同一 Change-IdI4a34b69c3943fb0574e6fca89b181850db0e766e,Gerrit dev=387202 / rls=387204; 修复前基底f63fe1cdc;本地 dev 分支同内容 commit470f9eaaa) 仓库路径:/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。
它有三个容易被忽视的设计点,也是历史问题的全部来源:
- 双语义滑块(2026-10-13 产品最终裁决口径):拖动 = 跟手逐值下发、松手停原值; 点击轨道 = 吸附到最近 10 的倍数(half-up,余数 ≥5 进位,Normal 主题;贴 thumb ±1 点击也必须取整)——后者是产品需求,见 N801PROB-86420(已关单 By Design, 问题原因字段原话:「整十吸附是需求」);GT 主题点击不生效(仅按压动画), 取整彻底关闭。
- 同一套滑块代码挂在三个页面(驾驶偏好主页 / M1 自定义页 / 主驾自定义页), 但 GT(mach)车型上后两个页面的能量回收项被车型门控移除,GT 只有主页一个滑块。
- 取整改写的值必须先让 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) |
三条纪律:
- 本 KB 所有 file:line 均以 rls-xcd-u-mp-26-v7.0 为基线;在 dev 等其他分支上核对时
行号可能有 1
3 行漂移(dev 与 rls 的 SliderPreference.java 就差 13 行),以符号定位为准。 - 「按下 thumb 瞬间的同值回调」已由组件库反编译澄清(08 篇 §3):GT IconSlider 在
ignoreClick=true时 DOWN 被computeTouchOffset精确平移到当前值,|Δ|<1e-4门 不派发;实际观测到的「同值回调」真身是 DOWN 后微抖 MOVE 的 float 变值 / int 同值 回调——Settings 侧按 int 值计数过滤的修复(387202/387204)对此精确有效。 - 分析线上截图/日志时先确认 ROM 所带 settings 版本是否含本修复
(同一 Change-Id
I4a34b69c3943fb0574e6fca89b181850db0e766e,Gerrit dev=387202 / rls=387204,当前 PS4=V3,查询时点 2026-10-13 均 NEW 未合入;rls 本地 commite8b5a7ba5)。注意 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_LEVEL | 1631614333 = 0x6140757d | INT32,0 |
| 禁用原因 | Driving.ENERGY_REGENERATION_BAN_REASON | 1631614331 = 0x6140757b | 0=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 key | Controller | 存在条件 |
|---|---|---|---|
| 驾驶偏好主页 | pk_settings_driving_braking_strength | BrakingStrengthPreferenceController.java | 所有车型,档位=自定义时可见 |
| M1 自定义页(Lux/Mann) | pk_settings_driving_custom_energy_recovery_strength | CustomEnergyRecoveryStrengthController.kt | 仅 Lux/Mann(isLuxOrMann()) |
| 主驾自定义页 | pk_settings_driving_main_custom_energy_recovery_strength | MainCustomEnergyRecoveryStrengthController.kt | 主驾自定义模式入口进入 |
关联知识库
- 05-车辆接口层与IPC —— CarProperty 读写/binder 链路,
本功能
setVehicleProperty同步下发的底层(车技车设根目录) - 00-蜂窝网络-README.md —— 同风格知识库示例;蜂窝库的「平台受理/执行分离」认知同样适用于本功能的信号下发