连接知识库 · 总索引
小米智能座舱 MiCarSettings ·「连接」模块全解 模块根目录:
settingsPage/micarConnectionSettings/约 110 个源文件,覆盖 蓝牙 / WLAN / 个人热点 / 手车互联(CarPlay·CarLink·AndroidAuto·小米互联) / 蜂窝网络 / 卫星通信 建立日期:2026-07-15 · 分支 dev · HEAD 583a310c8
子知识库导航
| 子库 | 入口 | 体例 |
|---|---|---|
| 蓝牙知识库 | 00-蓝牙-README.md | 基础概念→框架→模块流程→排障→精讲 |
| WLAN知识库 | 00-WLAN-README.md | 同蓝牙体例(姊妹库) |
本知识库由「7 个 Explore Agent 并行探索 + 主控独立对抗审查(亲自 grep/直读源码)」产出。
所有结论带 文件路径:行号,文案以 values-zh-rCN/strings.xml 直抄为唯一准绳。
对抗审查发现的错误/bug 见 _对抗审查记录.md,已核实事实见 _已核实事实基准.md。
一、连接模块全景
连接页是车设 13 个一级页面之一,在 app/src/region/{cn|global}/res/xml/miauto_top_level_menu_fragment.xml:79-86 静态声明(Lemans ECE 车型隐藏入口)。页面别名 PageAlias.PAGE_CONNECTION = "connection"。
flowchart TB Menu["车设顶层菜单<br/>miauto_top_level_menu_fragment.xml"] Menu -- "点击连接(语音可搜)<br/>psk_settings_connection_entry" --> Top subgraph Top["ConnectionSettingsTopFragment<br/>@Module(TAG_CONNECTION) @VoiceSearchProvider @MonitorFragment<br/>connection_settings_fragment.xml"] direction TB C1["① 基础连接<br/>pk_connection_basic_category"] C2["② 手车互联<br/>pk_connection_complex_category<br/>全无能力时整组隐藏"] C3["③ 蜂窝网络<br/>pk_connection_vehicle_network_category<br/>DCD 平台隐藏"] C4["④ 移动网络<br/>pk_connection_mobile_network<br/>无卫星能力时隐藏"] end Top -.getRightFragment().-> Right["ConnectionSettingsRightFragment<br/>车模(雷达/卡钳 4 图)"] C1 -- 蓝牙 intent BLUETOOTH_SETTINGS --> BT[BluetoothSettingsActivity] C1 -- WLAN intent WIFI_SETTINGS --> WF[WifiSettingsActivity] C1 -- 热点 intent HOTSPOT_SETTINGS --> HS[HotspotSettingActivity / MiCarHotspotSettingsActivity] C2 -- URI mis://complex/connect --> Link[外部互联 app<br/>com.mi.car.carplay 等] C3 -- Tab 内切换 --> Tel[TeleCommunicationSelectController] C4 -- 卫星 intent SATELLITE_COMMUNICATE --> Sat[SatelliteSettingsActivity] MSdk[("MisComplexSdk aar<br/>com.xiaomi.phonecarlink:complex:0.1.40")] -.状态回调.-> Top
四大类入口一览(文案直抄 values-zh-rCN/strings.xml)
| 分组 | 入口 | 用户可见文案 | 跳转方式 |
|---|---|---|---|
| ① 基础连接 | 蓝牙 | ”蓝牙” | intent BLUETOOTH_SETTINGS |
| WLAN | ”WLAN” | intent WIFI_SETTINGS(+extra refer) | |
| 热点 | ”热点” | intent HOTSPOT_SETTINGS | |
| ② 手车互联 | 小米设备互联 | ”小米设备互联” / “连接同账号的小米手机” | URI mis://complex/connect?action=mirror_setting |
| CarPlay | ”Apple CarPlay” / “连接 iPhone” | URI ?action=carplay_connect | |
| CarLink | ”ICCOA Carlink” / “连接 Android 手机” | URI ?action=carlink_connect | |
| Android Auto | ”Android Auto” / “连接 Android 手机” | URI ?action=android_auto_connect | |
| ③ 蜂窝网络 | 优先运营商 | ”优先运营商”(电信/移动/智能双卡) | Tab 内切换(DCD 隐藏) |
| ④ 移动网络 | 卫星通信 | ”卫星通信” / “可通过天通卫星接打电话” | intent SATELLITE_COMMUNICATE |
⚠️ 注意:CarLink 用户可见名是 “ICCOA Carlink”(大写 L);CarLink 与 Android Auto 的 summary 同为”连接 Android 手机”。
二、核心机制速查(5 条最重要结论)
1. 手车互联能力 = 对应 app 是否预装(非配置/属性)
bluetooth/ConnectionUtils.kt:35-59,全靠 PackageUtils.isPkgInstalled:
| 方法 | 判断的包名 |
|---|---|
| isMiuiShareSupported | com.xiaomi.mitv.smartshare |
| isCarPlaySupported | com.mi.car.carplay 或 com.desaysv.carplay(小米自研 ∪ 德赛西威) |
| isCarLinkSupported | com.mi.car.carlink |
| isAndroidAutoSupported | com.mi.car.androidauto |
by lazy 进程内只查一次 → 安装/卸载 app 后需重启 Settings 才刷新入口(潜在不一致)。
2. 蓝牙扫描有一把全局闸门 BluetoothScanManager
单例 object(bluetooth/BluetoothScanManager.kt),AtomicBoolean + ReentrantReadWriteLock + WeakReference<ScanStateListener>。triggerScan → MiBluetoothUtils.startDiscovery → LocalBluetoothAdapter.startScanning(true),force=true 绕过 settingslib 5 分钟节流。禁扫场景全仓库仅 2 处,全在 CarPlay 配对链路(普通配对不禁扫)。
3. 蓝牙发现 = 三层叠加
settingslib 事件总线(base/settingsLibAndroid/)+ 本仓扫描闸门 + 两个列表 Controller(已配对 BluetoothBondedDevicesPrefController / 可用 BluetoothUnbondedDevicesPrefController)。持续扫描循环:onScanningStateChanged(false) 即重扫,直到 onPause 或 BOND_BONDING。详见 01-蓝牙-发现流程.md。
4. MisComplexSdk 状态分发用「全局 getConnectInfo()」
ConnectionSettingsTopFragment 注册 IComplexConnectListener,收到回调后遍历 4 个 LinkController 调 onConnectStateChange;每个 Controller 取全局 getConnectInfo(),仅当 info.type == 自己的 CONNECT_TYPE 时显示设备名。前提假设:同一时刻只有一种互联 active。类型枚举:DEFAULT=0/MIRROR=1/CARPLAY=2/CARLINK=3/ANDROID_AUTO=4。
5. 个人热点存在两套并行实现
- A 套:
MiCarHotspot*(大写 S)+WifiTetheringHandler+hotspot/HotSpotViewModel - B 套:
Hotspot*+HotspotUtils+viewmodel/HotspotViewModel改 A 不影响 B,排查前必先确认入口。真正 startTethering 只有startMicarSoftAp一处,不用WifiManager.startTethering/TetheringManager。
三、平台差异(DCD vs XCD)
- DCD 平台 =
ro.board.platform == "msmnile"(DeviceUtil.java:226-228) - DCD 隐藏蜂窝网络分组(双卡选择);XCD P2.1 板子有双 eSIM(卡1电信/卡2移动)才显示
- 多处 flavor 双份源码:
src/dcddif/vssrc/xcddif/(TelephonyUtil、MiCarWifiCollinear、base/WifiTrackerLib、base/settingsLibAndroid)——改一处要同步改两套 - ⚠️ DCD 的
TelephonyUtil.isSupportSatelliteByDevice有反射 receiver bug(见对抗记录 Bug 1)
四、文档索引
docs/连接/
├── 00-README.md ← 本文件(总索引 + 全景)
├── _已核实事实基准.md ← 主控直读的文案库/能力依据/扫描主干(金标准)
├── _对抗审查记录.md ← 5 疑点核实 + 文案纠正
├── 01-连接主页架构与路由.md ← 页面结构/动态显隐/路由/MisComplexSdk 分发
├── 蓝牙/
│ ├── 00-蓝牙-README.md ← 蓝牙子索引 + 三层架构总览
│ ├── 01-蓝牙-发现流程.md ← ★重点:扫描闸门/触发/结果渲染/谁禁扫
│ ├── 02-蓝牙-配对流程.md ← Pairing/Picker/CarplayChoose 对话框 + 状态机
│ └── 03-蓝牙-设备详情与状态控制.md ← 详情页/PBAP profile/开关状态机
├── WLAN/
│ └── WLAN-全流程.md ← 扫描/连接/Provision 引导/NetworkRequest 弹窗
│ └── WLAN列表重建风暴与ANR机制详解.md ← ★性能案例:重建风暴四环放大/no-focused-window ANR/monkey 白名单(N801PROB-137881)
├── 个人热点/
│ └── 热点-全流程.md ← 两套实现/开关/配置/QR 分享/客户端/多形态
│ └── reboot-热点关闭与恢复机制.md ← reboot 时 init 停机相位差/daemon-death recovery/persist 语义/双机对照取证(MANNPROB-2933)
└── 车机互联/
├── 01-车机互联-CarPlay-CarLink-AndroidAuto.md ← 能力依据/状态分发/CarPlay 二次弹窗
└── 02-蜂窝网络与卫星通信.md ← 双卡选择/卫星弹窗/网络引导二维码
五、关键文件速查表
| 领域 | 核心文件(相对 settingsPage/micarConnectionSettings/src/main/java/com/android/car/settings/miauto/) |
|---|---|
| 连接主页 | connection/view/ConnectionSettingsTopFragment.java、connection/ConnectionConstants.kt、bluetooth/ConnectionUtils.kt |
| 蓝牙扫描闸门 | bluetooth/BluetoothScanManager.kt |
| 蓝牙工具 | bluetooth/MiBluetoothUtils.kt、MiBluetoothExt.kt |
| 蓝牙 settingslib | base/settingsLibAndroid/src/{dcddif,xcddif}/java/com/android/settingslib/bluetooth/ |
| WLAN 数据源 | base/WifiTrackerLib/src/{dcddif,xcddif}/java/com/android/wifitrackerlib/ |
| 热点开关 | hotspot/controller/TetherSwitchController.kt、hotspot/WifiTetheringHandler.java、hotspot/HotspotUtils.kt |
| 互联基类 | connection/controller/BaseVehicleLinkPreferenceController.java |
| 互联 SDK | aar com.xiaomi.phonecarlink:complex:0.1.40,init 点 app/.../AsyncThreadStartTask.java:217-220 |
| 蜂窝/卫星 | telecomm/TeleCommunicationSelectController.kt、satellite/SatelliteSettingDialog.kt、src/{xcddif,dcddif}/.../TelephonyUtil.kt |
| 页面 XML | res/xml/connection_settings_fragment.xml 等 |
| 文案 | res/values-zh-rCN/strings.xml(中文)、res/values/strings.xml(默认) |