连接知识库 · 已核实事实基准
本文件由主控 亲自 grep / 直读源码 核实,不采信任何 Agent 转述。 作为后续各章节文档与「对抗审查 Agent」核对的金标准锚点。 凡文档结论与此处冲突,以此处为准(除非此处的 file:line 已过时,需重新核实)。
核实日期:2026-07-15
1. 连接主页页面结构与文案(直抄 values-zh-rCN/strings.xml)
页面定义:settingsPage/micarConnectionSettings/src/main/res/xml/connection_settings_fragment.xml
页面标题 string:preference_screen_title_connection = “连接”(strings.xml:54)
1.1 基础连接(micar_connection_basic_group_title = “基础连接”,strings.xml:4)
| 入口 key | title (直抄) | summary | controller | 跳转 intent action |
|---|---|---|---|---|
| pk_connection_bluetooth_entry | ”蓝牙” (strings.xml:5) | — | BluetoothStateController | android.settings.BLUETOOTH_SETTINGS |
| pk_connection_wifi_entry | ”WLAN” (strings.xml:6) | — | WifiConnectionStateController | android.settings.WIFI_SETTINGS (extra refer=settings_connection_wifi) |
| pk_connection_hotpot_entry | ”热点” (strings.xml:7) | — | WifiTetherStatusController | android.settings.HOTSPOT_SETTINGS |
1.2 手车互联(micar_connection_complex_group_title = “手车互联”,strings.xml:8)
| 入口 key | title (直抄) | summary (直抄) | controller |
|---|---|---|---|
| pk_connection_miui_share_entry | ”小米设备互联” (strings.xml:9) | “连接同账号的小米手机” (strings.xml:10) | MobileConnVehiclePreferenceController |
| pk_connection_carplay_entry | ”Apple CarPlay” (strings.xml:11) | “连接 iPhone” (strings.xml:12) | CarplayLinkPreferenceController |
| pk_connection_carlink_entry | ”ICCOA Carlink” (strings.xml:13) | “连接 Android 手机” (strings.xml:14) | CarLinkPreferenceController |
| pk_connection_android_auto_entry | ”Android Auto” (strings.xml:15) | “连接 Android 手机” (strings.xml:16) | AndroidAutoPreferenceController |
注意:Carlink 与 Android Auto 的 summary 都是”连接 Android 手机”,不要混淆。 注意:CarLink 的用户可见名称是 “ICCOA Carlink”(大写 L),key 是 carlink。
1.3 蜂窝网络(micar_connection_vehicle_network_category = “蜂窝网络”,strings.xml:28)
- pk_connection_vehicle_network_default,title “优先运营商” (strings.xml:29),controller TeleCommunicationSelectController
- 三种运营商策略文案:CTCC = “优先使用中国电信,网络状态差时自动切换”;CMCC = “优先使用中国移动…”;auto = “智能双卡” = “根据网络状态动态切换运营商,提高网络服务质量” (strings.xml:30-32)
1.4 移动网络(micar_connection_mobile_network_title = “移动网络”,strings.xml:25)
- pk_connection_mobile_network_via_satellite,title “卫星通信” (strings.xml:38),summary “可通过天通卫星接打电话” (strings.xml:39),controller MobileNetworkSatelliteController,intent android.settings.SATELLITE_COMMUNICATE
- 卫星状态:已关闭 / 已开启 (strings.xml:40-41)
- 卫星对话框全套文案见 strings.xml:42-52(含”开启卫星通讯后,车辆将断开蜂窝网络”等)
2. 手车互联能力判断依据(直读 bluetooth/ConnectionUtils.kt)
核心结论:手车互联能力完全由”对应 app 是否预装”决定(PackageUtils.isPkgInstalled),不是 SystemProperty 也不是 mi.car.config。
文件:settingsPage/micarConnectionSettings/src/main/java/com/android/car/settings/miauto/bluetooth/ConnectionUtils.kt
| 方法 | 行号 | 判断依据(包名是否存在) |
|---|---|---|
| isMiuiShareSupported() | 111-113 → 字段 35-38 | com.xiaomi.mitv.smartshare 是否安装 |
| isCarPlaySupported() | 117-119 → 字段 41-47 | com.mi.car.carplay 或 com.desaysv.carplay(小米自研 ∪ 德赛西威两套实现) |
| isCarLinkSupported() | 123-125 → 字段 50-53 | com.mi.car.carlink 是否安装 |
| isAndroidAutoSupported() | 129-131 → 字段 56-59 | com.mi.car.androidauto 是否安装 |
| isPhoneCarLinkSupported() | 135-138 | 上述四者任一为 true |
字段全部用 by lazy 懒加载,首次访问时查包名并缓存。
CarPlay 设备级识别(与上面”车机能力”不同):
isCarPlaySupportDevice(device)(ConnectionUtils.kt:101-107):通过蓝牙 EIR UUID2d8d2466-e14d-451c-88bc-7301abea291a(CARPLAY_128UUID, :30-31)判断某具体蓝牙设备是否支持 CarPlay。
架构含义:不同车型/ROM 通过预装 app 裁剪互联能力,而非编译期配置。运行时动态查询包名。
3. 连接主页动态显隐(直读 ConnectionSettingsTopFragment.java)
文件:connection/view/ConnectionSettingsTopFragment.java,方法 getPreferenceKeyResIdsToRemove() (:168-199)
逐条规则:
- 整组隐藏手车互联:若
!ConnectionUtils.isPhoneCarLinkSupported()(四者都不支持)→ 移除pk_connection_complex_category+pk_connection_vehicle_network_category_space(:172-173) - 否则逐项隐藏:不支持 MiuiShare → 移除 miui_share_entry (:176);不支持 CarPlay → 移除 carplay_entry (:179);不支持 CarLink → 移除 carlink_entry (:182);不支持 AndroidAuto → 移除 android_auto_entry (:185)
- DCD 平台隐藏蜂窝网络:
DeviceUtil.isDCDPlatform()→ 移除pk_connection_vehicle_network_category+ space (:190-192)(注释:XCD 默认双卡) - 不支持卫星则隐藏移动网络:
!TelephonyUtil.isSupportSatelliteByDevice()→ 移除pk_connection_mobile_network(:195-197)
4. 蓝牙扫描主干(直读三文件)
4.1 入口 Activity(直读 bluetooth/view/BluetoothSettingsActivity.kt)
- 继承
DialogBaseCarSettingsActivity,getInitialFragment()→BluetoothMainEntrySettingsFragment()(:89-91) onCreate调BluetoothScanManager.resetScanFlag("bluetooth_setting_onCreate")(:44) —— 进入页面重置扫描闸门为允许- 注册广播
ACTION_CLOSE_ACTIVITY = "com.micar.settings.action.CLOSE_BLUETOOTH_SETTINGS_ACTIVITY"(:26),收到后safeFinish()—— 给 CarPlay/AndroidAuto 用:连蓝牙后若打开 CarPlay/AA 弹窗,自动关蓝牙列表页 (:32-38) RECEIVER_EXPORTED = 0x2,API > S_V2 时带 Flag 注册 (:48-59)
4.2 扫描闸门(直读 bluetooth/BluetoothScanManager.kt,单例 object)
mCanExecuteBluetoothScan: AtomicBoolean(true)(:24) —— 全局扫描许可mLock: ReentrantReadWriteLock(:27) —— 读写锁保护mScanStateListeners: List<WeakReference<ScanStateListener>>(:33) —— WeakReference 防泄漏mUIHandler主线程 Handler (:30)canExecuteScan()(:49) /setCanExecuteScan(canScan, scenario)(:60) /triggerScan(scenario)(:94) /resetScanFlag(scene)(:110) /registerScanStateListener(:121) /unregisterScanStateListener(:143) /clear()(:173)- triggerScan 内部:canScan 为真时
mUIHandler.post { MiBluetoothUtils.startDiscovery() }(:99-101) - setCanExecuteScan 设计:写锁内改值 + 复制监听器列表,锁外 post 到主线程通知 (:64-87),避免锁竞争与死锁
- 监听器去重:用
System.identityHashCode标识对象防重复注册 (:127-130) - 注释明确:
setCanExecuteScan不要随意调用,需 @hanguoliang1 确认 (:55)
4.3 主页 Fragment(直读 bluetooth/view/BluetoothMainEntrySettingsFragment.java)
- 继承
DialogSettingsFragment,实现BluetoothCallback+OnPreferenceUpdateListener(:56-57) - 页面 xml:
R.xml.bluetooth_mainlist_fragment(:69) onAttach取MiBluetoothUtils.getLocalBtManager()(:211)onStartgetEventManager().registerCallback(this)+ setForegroundActivity (:217-218);onStop反注册 (:222-225)onBluetoothStateChanged:STATE_OFF → showNoDevicePaired(true) + resetActivityFragmentIfNeeded;STATE_ON → showNoDevicePaired(false) (:159-169)- UI 先行:
preHandleBtOff()蓝牙关闭时先行隐藏已配对/未配对列表 (:192-206);enableBluetooth()开关先 setLoading(true) + setChecked(true) 再异步 enable (:265-288),ThreadPoolUtils.ASYNC.execute(localBluetoothAdapter::enable) - 两个核心 Controller:
BluetoothBondedDevicesPrefController(pk_bluetooth_paired_devices 已配对) /BluetoothUnbondedDevicesPrefController(pk_bluetooth_available_devices_e2 可用)
LocalBluetoothManager / LocalBluetoothAdapter / BluetoothCallback 来自
com.android.settingslib.bluetooth(待确认具体在 base/ 哪个 lib,由 WLAN/蓝牙 Agent 核实)。
5. 待核实清单(留给 Agent / 对抗审查)
- settingslib 的 LocalBluetoothManager 具体依赖哪个 base lib
- 所有
setCanExecuteScan(false, ...)调用点(哪些场景禁止扫描)—— 蓝牙发现 Agent 负责 - MiComplexSdk (com.xiaomi.mis.complex) 是 aar 还是源码、ConnectInfo.getType() 枚举 —— 车机互联 Agent 负责
- DeviceUtil.isDCDPlatform / isKunLun 判断依据 —— 连接框架 Agent 负责
- TelephonyUtil.isSupportSatelliteByDevice 判断依据 —— 车机互联 Agent 负责
- 各子模块文案(蓝牙/WiFi/热点 子页面)需以 strings.xml 直抄补全
6. 蓝牙知识库 2.0 核实追加(2026-07-23,主控亲自 grep/直读 bugreport)
6.1 三 flavor 体系(新增 f3dif)
- settingslib 三 flavor:dcddif(骁龙8295) / xcddif(玄戒A14) / f3dif(玄戒A17主线)。
base/settingsLibAndroid/build.gradle:59-82:dcd→dcddif / xcd_cn_a14→xcddif / xcd_cn_a17→f3dif / xcd_global_a17→f3dif+global(global 目录预留暂空)。 DeviceUtil.isDCDPlatform()=ro.board.platform=="msmnile"(DeviceUtil.java:226);无 isXring/isKunLunPlatform;isKunLun()是车型非平台。- 三套同名同包(
com.android.settingslib.bluetooth)不同实现,无继承;src/main 无蓝牙代码。
6.2 🚨 f3dif(A17 主线)= 纯上游 AOSP(重大认知)
- f3dif
CachedBluetoothDevice.java0 个 MICAR-PORTING 标记(xcddif 33 / dcddif 10)。 - 无
isCloseAutoConnectDevice黑名单、无 半关 ScreenChangedHandler、无 try/catch 广播保护(BluetoothEventManager.java,xcddif:387-389 独有)、timeout 不翻倍(MAX_UUID 35000 vs xcddif 5000)。 onBondingStateChanged(int bondState, int prevBondState)双参 :1147(xcddif:1050 / dcddif:839 单参)。
6.3 🚨 CarPlay 黑名单 A17 失效(假设 H6)
disableAutoConnect所有 flavor 都写Settings.Secure bluetooth_close_autoconnect(ConnectionUtils.kt:32),仅MiBluetoothPairingRequest.kt:106调用。- 但 f3dif 无
isCloseAutoConnectDevice读逻辑 → A17 CarPlay 设备配对后仍自动连 HFP/A2DP,黑名单策略 100% 失效。
6.4 🚨 MANNPROB-2956 当前未修复(纠正”已修复”旧认知)
- commit
7239803be在dev_a17_0610为悬空提交(git merge-base --is-ancestor 7239803be HEAD返回非祖先、git fsck显示 dangling),已被 reset,未合入。 onCancel(MiBluetoothPairingController.kt:283) 仍是旧版仅cancelBondProcess,无 bonded→removeBond 降级。DialogActivity 无mDismissed。- 核实修复应用
git merge-base --is-ancestor <c> HEAD,勿信git branch --contains(后者受本地 reflog 影响曾误导主控)。
6.5 行号修正(版本漂移)
isDeviceClassTypeSupport: MiBluetoothUtils.kt:141-170(非 131-160);condition2 AUDIO_VIDEO 系列分支(car_audio:159/耳机:161-164)是死代码。onCancel: :283(非 279/281)。- CachedBluetoothDevice(xcddif): onBondingStateChanged:1050 / isCloseAutoConnectDevice:1032-1046 / 早退:1079 / connect:429 / connectDevice:521 / mDevice.connect():544。
- 双蓝牙五处调用行(非 if 判定行): MiBluetoothPairingRequest:90 / Unbonded:526 / Operations:142 / Bonded:295 / CarplayChoose:111。对讲机 MAC 前缀
CC:72:86(MiBluetoothUtils.kt:37)。
6.6 协议/技术纠正
- CarPlay 不是蓝牙 profile,数据走 WiFi;deeplink
mis://complex/connect?action=carplay_connect&bt_mac=(ConnectionConstants:2-3,非 connection://);EIR UUID2d8d2466-e14d-451c-88bc-7301abea291a(ConnectionUtils.kt:30-31)。 - CTKD 方向 BR→LE:44.855 落 BR/EDR Link Key(key_type=0x8),45.087
smp_calculate_long_term_key_from_link_key从 Link Key 派生 LE LTK + 存 IRK(BTM_LE_KEY_PID)。 - PAN isAutoConnectable=false(三 flavor: f3dif:85-87 / xcddif:87-89 / dcddif:88-90)。
- isAutoConnectable 是 LocalBluetoothProfile 接口方法,框架层用,settingslib connect 链不调。
- variant 命名鸿沟:native
sspRequestCallback pairingVariant 0vs appPAIRING_VARIANT_PASSKEY_CONFIRMATION 2,BR/EDR SC 下都对应 Numeric Comparison UI。 - bt_config 路径:
/data/misc/bluedroid/hci1_bt_config.conf(小米双适配器 hci1_ 前缀),按 MAC 分段,无 [LinkKeys]/[LeKeys] 段。
6.7 AOSP 框架源码(本机镜像核实)
/home/zbc/pangu/yu7/packages/modules/Bluetooth/真实存在。BondStateMachine.java:583“is bonded, wait for SDP complete”;sPendingUuidUpdateTimeoutMillis=3000(:86);BONDED_INTENT_DELAY=11(:81)。- BluetoothDevice.java: createBond:2299/cancelBondProcess:2457/removeBond:2490/getBondState:2590/setPairingConfirmation:3339。
- ACTION_PAIRING_REQUEST 由 BondStateMachine(:516/:659) 发出,非 AdapterService;ACTION_ACL_* 由 RemoteDevices 发出。
- Bluetooth Mainline:Android 13 起 optional 模块,Android 16 fully。
6.8 待核实清单更新(本轮闭环)
- MiComplexSdk 是 aar(
com.xiaomi.phonecarlink:complex:0.1.40),非源码 - setCanExecuteScan(false) 仅 2 处,全在 CarPlay 配对链路
- DeviceUtil.isDCDPlatform = ro.board.platform==msmnile
- settingslib 三 flavor,A17 主线 f3dif
- f3dif 黑名单失效是否为预期(需框架/产品确认是否要回填 MICAR-PORTING patch)
- 2956 修复 commit 是否需重新 cherry-pick 到 dev_a17_0610
7. 蓝牙 flavor 与 Auracast QR 核实追加(2026-09-06,主控 session 亲读 + 红队 agent 盲核交叉)
本轮为 80 系列/23 章落库前核验,12 条声明 11 PASS 1 FAIL(FAIL 见 §7.5)。对抗过程见
_对抗审查记录.md第四轮。
7.1 f3dif 已合入 dev(⚠️ 推翻 §6.1 相关旧表述)
git ls-files base/settingsLibAndroid/src/f3dif/= 262 文件被 dev 跟踪;commitb57402a19(“[Feature][All-Vehicle] targetSdk 升级到 37 适配 - part1”,78 文件)触及其中 3 文件。- dev 的 f3dif
CachedBluetoothDevice.java= 2719 行,与dev_a17_0610分支同一 blob(d19660e061c705b45fb59fed276cf559a167bf57)——60 系列 f3dif 行号基线在 dev 可直接复用。xcddif 1998 行 / dcddif 1456 行(当日实测)。
7.2 sourceSets 5 变体(build.gradle:56-90)
- dcd→dcddif(:57-62)、xcd_cn_a14→xcddif(:64-69)、xcd_global_a14→xcddif+global(:71-76,较 §6.1 新增海外 A14 变体)、xcd_cn_a17→f3dif(:78-83)、xcd_global_a17→f3dif+global(:84-89)。
- 细节:xcd_global_a17 的 aidl.srcDirs 指向
src/main/aidl(:88),其余 flavor 为src/main/java。
7.3 Auracast QR(详见 蓝牙/80-Auracast广播QR篇/)
BluetoothBroadcastUtils.java仅 xcddif/f3dif 存在(dcddif 无);5 常量零方法(L24/L29-30/L35/L41/L46)。SCHEME_BT_BROADCAST_METADATA:xcddif="BT:"(:46)、f3dif="BLUETOOTH:UUID:184F;"(:46)——两文件唯一差异(diff 仅 46c46),跨平台扫码互不识别是预期行为。- 其余 4 常量全仓(java/kt/xml)零引用;引用 Utils 的仅两 flavor
BluetoothLeBroadcastMetadataExt.kt(:29),再上游是LocalBluetoothLeBroadcastMetadata.kt(:19/:29)。 - dcddif bluetooth 目录 26 文件无任何 Broadcast/LeAudio 类、无 .kt——dcd 车型无 LE Audio 广播能力。
7.4 BluetoothCallback 实现者(6 个,2026-09-06 全仓核实)
BluetoothPreferenceController.java:50(覆写 8 法 :137-166)、BluetoothMainEntrySettingsFragment.java:56(主源集)。- f3dif 专属 4 个:
BluetoothEventManagerExt.kt:28、LocalBluetoothManagerExt.kt:28、hearingdevices/ui/PresetUiController.kt:66、hearingdevices/ui/AmbientVolumeUiController.java:63。 - 方法数复核与第三轮勘误表一致:dcddif 10 / xcddif 15 / f3dif 11;f3dif 的
onAutoOnStateChanged在接口 :174、EventManager dispatch :640;5 个被删回调(codec/CSIP×2/广播×2)的 dispatch 在 f3dif EventManager 零命中。
7.5 本轮 FAIL 记录(防再犯)
- 声明”BluetoothPreferenceController 是除 EventManager 外唯一实现”为假(漏 Kotlin
object :与多接口 implements)——查实现者必须组合搜implements X/object : X/X>。
8. CachedBluetoothDeviceManager 坑位核实追加(2026-09-06,第五轮,主控亲读 + 红队盲核 9/9 PASS)
面向 42 §7 / 63 章增补的金标准锚点。行号默认 xcddif 版 CBDM(dcd 主视角)。
- 解配联动不对称(xcddif 独有分叉):
onDeviceUnpairedCBDM:375-418——AOSP”主设备解配→组员级联 unpair”被注释 :382-387(MIUI MOD: BT_LeAudio:381/:401),替代 :389 clearMemberDevices + :394 重置 groupId;“组员解配→主设备 unpair” :403-406 仍生效。不对称仅限 CSIP 组员;助听 subDevice :407-417 两方向对称。f3dif 无此分叉。 - 首组 return(AOSP 血统):clearNonBondedSubDevices xcddif:274 / f3dif:303;onScanningStateChanged xcddif:305 / f3dif:327。
- clearAllDevices:仅 xcddif 定义(:286-291;dcddif/f3dif 无此方法),全仓零调用,且无 release()(对比 clearNonBondedDevices :256 有)。
- onDeviceDisappeared:三 flavor 定义 xcddif:70 / dcddif:56 / f3dif:73,全仓零调用。
- 命名混用:onBondStateChangedIfProcess CBDM:538 vs onProfileConnectionStateChangedIfProcessed CBDM:352;BEM 调用前者 :573。
- clearNonBondedDevices 调用点=4:全在 BluetoothUnbondedDevicesPrefController.java :169/:226/:245/:331。
- 锁结构 xcddif:18 个 synchronized 方法 + addDevice:126 块;onDeviceDisappeared static 无锁。
- addDevice 分叉不变式:CBDM:132-136——组员/子设备挂靠成功则不进主列表、不触发 onDeviceAdded。