连接知识库 · 已核实事实基准

本文件由主控 亲自 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)

入口 keytitle (直抄)summarycontroller跳转 intent action
pk_connection_bluetooth_entry”蓝牙” (strings.xml:5)BluetoothStateControllerandroid.settings.BLUETOOTH_SETTINGS
pk_connection_wifi_entry”WLAN” (strings.xml:6)WifiConnectionStateControllerandroid.settings.WIFI_SETTINGS (extra refer=settings_connection_wifi)
pk_connection_hotpot_entry”热点” (strings.xml:7)WifiTetherStatusControllerandroid.settings.HOTSPOT_SETTINGS

1.2 手车互联(micar_connection_complex_group_title = “手车互联”,strings.xml:8)

入口 keytitle (直抄)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-38com.xiaomi.mitv.smartshare 是否安装
isCarPlaySupported()117-119 → 字段 41-47com.mi.car.carplaycom.desaysv.carplay(小米自研 ∪ 德赛西威两套实现)
isCarLinkSupported()123-125 → 字段 50-53com.mi.car.carlink 是否安装
isAndroidAutoSupported()129-131 → 字段 56-59com.mi.car.androidauto 是否安装
isPhoneCarLinkSupported()135-138上述四者任一为 true

字段全部用 by lazy 懒加载,首次访问时查包名并缓存。

CarPlay 设备级识别(与上面”车机能力”不同):

  • isCarPlaySupportDevice(device) (ConnectionUtils.kt:101-107):通过蓝牙 EIR UUID 2d8d2466-e14d-451c-88bc-7301abea291a(CARPLAY_128UUID, :30-31)判断某具体蓝牙设备是否支持 CarPlay。

架构含义:不同车型/ROM 通过预装 app 裁剪互联能力,而非编译期配置。运行时动态查询包名。


3. 连接主页动态显隐(直读 ConnectionSettingsTopFragment.java

文件:connection/view/ConnectionSettingsTopFragment.java,方法 getPreferenceKeyResIdsToRemove() (:168-199)

逐条规则:

  1. 整组隐藏手车互联:若 !ConnectionUtils.isPhoneCarLinkSupported()(四者都不支持)→ 移除 pk_connection_complex_category + pk_connection_vehicle_network_category_space (:172-173)
  2. 否则逐项隐藏:不支持 MiuiShare → 移除 miui_share_entry (:176);不支持 CarPlay → 移除 carplay_entry (:179);不支持 CarLink → 移除 carlink_entry (:182);不支持 AndroidAuto → 移除 android_auto_entry (:185)
  3. DCD 平台隐藏蜂窝网络DeviceUtil.isDCDPlatform() → 移除 pk_connection_vehicle_network_category + space (:190-192)(注释:XCD 默认双卡)
  4. 不支持卫星则隐藏移动网络!TelephonyUtil.isSupportSatelliteByDevice() → 移除 pk_connection_mobile_network (:195-197)

4. 蓝牙扫描主干(直读三文件)

4.1 入口 Activity(直读 bluetooth/view/BluetoothSettingsActivity.kt

  • 继承 DialogBaseCarSettingsActivitygetInitialFragment()BluetoothMainEntrySettingsFragment() (:89-91)
  • onCreateBluetoothScanManager.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)
  • onAttachMiBluetoothUtils.getLocalBtManager() (:211)
  • onStart getEventManager().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.java 0 个 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 7239803bedev_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 UUID 2d8d2466-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 0 vs app PAIRING_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 跟踪;commit b57402a19(“[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:28LocalBluetoothManagerExt.kt:28hearingdevices/ui/PresetUiController.kt:66hearingdevices/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 独有分叉)onDeviceUnpaired CBDM: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。