蜂窝网络知识库 · 总索引
小米智能座舱 MiCarSettings ·「连接」页 →「蜂窝网络」子模块全解 代码基线:
fuben4_micarsettings/MiCarSettingsdev 分支 · HEADb006d1144(2026-09-20) 平台源码基线:/home/zbc/pangu/yu7(miui/frameworks/telephony) 建立日期:2026-09-21
这个模块是什么
车机(XCD 平台)同时内置两张 eSIM:卡 1 = 中国电信、卡 2 = 中国移动。 「蜂窝网络」区的优先运营商控件让用户三选一:
| Tab | 语义 | 通道值 |
|---|---|---|
| 中国电信 | 数据固定走卡 1 | NETWORK_CTCC = 0 |
| 中国移动 | 数据固定走卡 2 | NETWORK_CMCC = 1 |
| 智能双卡 | 平台按网络质量自动切换(默认) | NETWORK_AUTO = 2 |
设置 App 本身不执行任何网络切换——它只负责 UI、偏好持久化和把意图通过
TelephonyManagerEx 传给平台 telephony;真正的选卡/切卡/断网保护全部在平台侧。
文档导航(从易到难)
| 篇目 | 适合谁 | 内容 |
|---|---|---|
| 01-功能与页面结构 | 新手 | 功能语义、UI 结构、文案/Key 清单、可见即可说 |
| 02-整体架构与流程图 | 新手→进阶 | 分层架构、类关系、点击/开页/ECALL 全流程图(多图) |
| 03-App 侧源码精讲 | 进阶 | Controller / Tab 框架 / TelephonyUtil 逐段拆解,file:line |
| 04-平台侧受理与执行 | 进阶→深入 | TelephonyManagerEx→路由控制器→通道控制器全链,受理/执行分离 |
| 05-排障实战与常见问题 | 排查问题 | 历史 JIRA 定案复盘 + 排查 playbook + 决策树 |
| 06-速查卡 | 所有人 | 文件清单、常量、Settings key、adb 命令、对接人 |
学习路径建议
flowchart LR A["01 功能与页面结构<br/>知道它是什么"] --> B["02 架构与流程图<br/>知道数据怎么流"] B --> C["03 App 源码精讲<br/>改 UI/加门控看这"] C --> D["04 平台侧受理与执行<br/>甩单/联调看这"] D --> E["05 排障实战<br/>有单看这"] F["06 速查卡<br/>随用随查"] -.贯穿.-> A & B & C & D & E
- 只想改文案/加 Tab:01 + 03 的前两节
- 要改交互/加 SIM 在位门控:01 → 02 → 03
- 问题单责任分层(App vs 平台):02 的两张时序图 → 04 → 05
一句话架构
flowchart TB XML["connection_settings_fragment.xml:121<br/>NewTabPreference"] --> CTRL["TeleCommunicationSelectController<br/>(连接页 Controller)"] CTRL --> UTIL["TelephonyUtil(反射封装)<br/>xcddif/f3dif 全功能 · dcddif 空桩"] UTIL --> EX["android.telephony.TelephonyManagerEx<br/>平台隐藏 API"] EX --> BINDER["IAutoTelephony(binder)"] BINDER --> ROUTE["MultiInternetRouteController<br/>受理层:记偏好,恒 true"] ROUTE --> SMART["SmartDataChannelController<br/>执行层:rat 校验,不满足直接 ignore"] SMART --> MODEM[("modem / UICC<br/>卡1=电信 卡2=移动")]
⚠️ 整个模块最重要的认知:平台是「受理/执行分离」——
setUserDefaultChannel返回 true 只代表”偏好被记下了”,不代表网络真的切过去了。详见 04 篇。