蓝牙知识库 · 总索引

模块根:settingsPage/micarConnectionSettings/src/main/java/com/android/car/settings/miauto/bluetooth/(约 30 源文件) settingslib:base/settingsLibAndroid/src/{dcddif,xcddif,f3dif}/java/com/android/settingslib/bluetooth/(dev 分支现有三 flavor 源集:dcd→dcddif、A14 变体→xcddif、A17 变体→f3dif,海外变体叠加 src/global;f3dif 已随 targetSdk 37 适配(b57402a19 等)合入 dev,2026-09-06 核实,推翻 2026-08-23”f3dif 仅 A17 分支”旧结论——dev 的 f3dif CachedBluetoothDevice.java 与 dev_a17_0610 为同一 blob,60-系列 f3dif 行号(2719 行基线)在 dev 可直接复用;维护者确认 a17 已全面切 dev 交付,a17/xcd/dcd 三机型统一走 dev 分支交付,dev_a17_0610/dev_a17 仅历史参照) 维护:每篇事实带 file:line 锚点,对抗审查核实;金标准见 _已核实事实基准、对抗过程见 _对抗审查记录

学习路径

flowchart LR
    A[10 协议速成] --> B[11 SSP配对]
    B --> C[12 Profile体系]
    C --> D[20 框架全景]
    D --> E[21 settingslib]
    E --> F[01 发现流程]
    F --> G[02 配对流程]
    G --> H[03 设备详情]
    H --> I[31~33 连接/Picker/CarPlay]
    I --> J[40 日志取证]
    J --> K[41 2956案例]
    A -.小白补强.-> X[13 分层 详解]
    X --> Y[14 缩写 词源]
    Y --> Z[15 Profile 与传输]
    Z -.回到.-> B
    style A fill:#e1f5ff
    style K fill:#fff4e1
    style X fill:#f3e5f5

新人:按 10→11→12→20→21→01→02→03→31~33→40→41 顺序读(概念地基→框架→业务流程→排障)。 排障:直接查 40/41/42 + 速查卡 50/51改代码:先读 22(双 flavor)+ 42(踩坑)+ 23(回调接入)。

文档结构

10-基础概念篇(协议地基,新人第一课)

文档主题核心问题
10-蓝牙协议速成BR/EDR/BLE/ACL/SDP/UUID/CoD三层状态(bond/ACL/profile)独立;车机连手机走 BR/EDR;扫描只显手机=有意
11-配对与SSP安全机制SSP 四模式/变体/取消语义★2956 根因;cancelBondProcess vs removeBond;CTKD BR→LE
12-Profile体系与车机角色HFP/A2DP/PBAP/CarPlay 角色车机=HF/Sink/Client;PBAP 唯一开关;CarPlay 蓝牙跳板走WiFi
13-协议栈分层详解PHY→应用 8 层 / BR/EDR vs BLE 双栈★小白补强;缩写怎么摞起来;一首歌从手机到喇叭的数据通路;分层为什么复用
14-缩写词源手册每个缩写全称+逐词拆解+记忆钩子★小白补强;缩写怎么来的;命名规律(P=协议/profile、角色后缀、UUID base)
15-Profile与传输协议图解HFP/A2DP/PBAP/GATT 靠什么传★小白补强;协议是什么含义;RFCOMM/AVDTP/OBEX/ATT 各 profile 专用传输
16-SIG分配号官方对照表UUID/CoD/Company ID 官方编号★官方规范(2026-07-31 PDF);504 条 GATT 特征值全表;已纠正 PBAP/Apple/Xiaomi 等常见误引

小白补强三件套(13/14/15):10/11/12 偏速成与代码,纯新手若觉得术语太密,按 10→13→14→15→11→12 顺序读更顺——先用 13 建分层骨架、14 查术语、15 懂每个 profile 干嘛,再回头啃 11 配对细节和 12 代码角色。

20-Android框架篇

文档主题核心问题
20-Android蓝牙框架全景五层架构/BondStateMachine/日志tag★新人第二课;BONDED 广播被 SDP 延迟;getBondState 才权威
21-settingslib架构与事件流四件套/广播总线/自动连接三 flavor 对照;isAutoConnectable 不在 connect 链
22-双flavor差异dcddif/xcddif/f3dif★改代码前必读;f3dif(A17主线)=纯AOSP;flavor 检查清单
23-BluetoothCallback契约与接入指南回调契约/实现者全景/扩展三步default+IntDef 设计语言;6 个实现者(2026-09-06核实);flavor 成对增删矩阵

30-模块流程篇(业务流程)

文档主题核心问题
01-蓝牙-发现流程扫描/Discovery★用户关注;扫描闸门;持续扫描循环
02-蓝牙-配对流程pair/bond+对话框三类对话框;CarPlay 二次弹窗;含 2956 广播延迟修正
03-蓝牙-设备详情与状态控制详情页+开关详情页极简(仅PBAP);开关 UI 先行+防抖
31-连接与自动连接策略自动连接/回连/黑名单connect 链三 flavor;last device;★H6 f3dif 黑名单失效
32-双蓝牙上限与PickerDOUBLE_BLUETOOTH_DEVICE_LIMIT=2五处调用点三类场景;Picker 冲替;DevicePairStageEvent
33-CarPlay特殊链路CarPlay 识别→配对→跳板EIR UUID;150/200ms 延迟;mis:// deeplink
34-已配对列表摘要状态机已连接/正在连接/已保存三态全解AOSP vs MiCar 双实现+流程图;mIsConnectingState 旁路三写入点;★3187/3205 归因底座
35-复合连接互斥弹窗连接蓝牙将断开 ICCOA Carlink 二次确认判定矩阵(type×地址);四入口;★getConnectInfo 快照陈旧误弹风险;日志锚点 d-confirm
36-可见即可说语音链路喊”连接第N个/设备名”怎么执行★语音=匹配标签+合成点击,与手点同路径;notifyVoiceActive 分发;MiCarViewDescription 热词/序号/意图词;AIDL 五接口反编译实证
对比视角-AOSP-vs-MiCar摘要设计设计哲学/状态模型/时序/缺陷史对比为什么 bug 只长在 MiCar 侧;设计建议 7 条;v2:+双源两种失败模式(3187跨设备/2471同设备跨profile)+AOSP 两大支柱(读取侧聚合×后台线程)

40-排障实战篇

文档主题核心问题
40-日志取证速查grep/awk/ffmpeg 命令★2956 bugreport 为教材;三层时间线;命令可复制
41-经典案例 MANNPROB-2956配对取消仍成功★方法论;四假设对抗推翻;当前未修复
42-踩坑与反直觉设计死代码/反直觉/flavor陷阱持续追加;改代码前排障前必读
43-蓝牙慢分段定位-MANNPROB-3187蓝牙慢分段定位方法论首案广播40-77ms不慢/建链4~5.5s慢=协议栈;A14对照;录屏vs装包两查

50-速查卡

文档主题
50-术语与类职责速查术语表 + 30 源文件/settingslib 七姐妹职责
51-广播与事件清单BluetoothEventManager 三 flavor 广播表 + 自定义广播 + Callback

60-CachedBluetoothDevice精讲篇(单类解剖,2026-08-20 新增)

文档主题核心问题
60-总览与学习地图系列导航/与既有篇目分工三条方法论:字段=事件痕迹/透传vs缓存/锁内禁binder
61-一台蓝牙设备的Android身份bond/ACL/profile 三层状态模型★零基础第一课;8种合法状态组合;getter两类
62-字段逐个精讲41个实例字段9组逐个讲mProfiles主写入者是外部类;mConnectAttempted注释骗人;60s看门狗
63-对象的一生谁创建/持有/销毁 CBD五个诞生入口;单例永不销毁;clearNonBondedDevices三宗案
64-连接与断开点击→framework全链路mProfiles空放弃等UUID;PBAP兜底;setEnabled=改策略
65-属性刷新与回调分发字段变化→像素更新5跳一张表两本账;双通道派发;UI三层回调注册
66-bond状态与自动回连状态机+耐心窗口+黑名单isBondingInitiatedLocally闸门;f3dif黑名单缺失(H6)
67-active设备与多设备四维active/CSIP组/换壳/电量单双active并存;换壳hash陷阱;组最小电量
68-实战案例走读9条已定案JIRA对代码讲★2403/3187/1922/3492/134132/2960/3960/2846/4867;知识矩阵
69-dcddif版全览-1456行小白导览dcddif基线自成一体入门导览AOSP/高通/小米三血统;60s看门狗;改dcddif前必读

70-active设备闭环篇(“当前音频从谁出”四象限,2026-08-23 新增)

文档主题核心问题
70-总览与闭环地图查询/监听/设置/消费四象限导航★闭环地图;三个头条发现(setActive零调用/AOSP文案管道死链/车机真实切音源=连接新设备);关键锚点速查表
71-查询侧-fetchActiveDevices与四维active位pull对账链单/双active判定;dcddif走mService代理vs xcddif走Adapter.getActiveDevices;3个调用点
72-监听侧-广播到onActiveDeviceChangedpush广播链3~4条ACTION_ACTIVE_DEVICE_CHANGED注册分发全链;isActive=Objects.equals推导;xcddif CSIP组员回销
73-设置侧-setActive与UI触发链set链+车机真实交互setActive逐行精讲(全仓零调用);profile.setActiveDevice走AdapterUtil双蓝牙路由;切音源=performConnect链
74-消费侧-活跃状态如何变成界面文案consume文案链”使用中”三分支+isOnCall;车机四下标数组实值;MiCar自建三态摘要替代AOSP管道

80-Auracast广播QR篇(广播音频扫码链路,2026-09-06 新增)

文档主题核心问题
80-总览与链路地图Utils→Ext→LocalBluetoothLeBroadcastMetadataflavor 能力矩阵;dcd 无此类;xcddif "BT:" vs f3dif SIG 标准前缀互不兼容
81-QR码协议与编解码QR 字段表/生成/解析规则R/T/D/AS/B… 全字段锚点;逐字段查重防御;解析失败返 null 必处理

三层架构

蓝牙 = settingslib 事件总线 + 本仓扫描闸门 + UI 层(Activity/Fragment/Controller/Preference)

flowchart LR
    subgraph UI["本仓 UI 层"]
        Act["BluetoothSettingsActivity"]
        Frag["BluetoothMainEntrySettingsFragment<br/>(BluetoothCallback)"]
        Scan["BluetoothScanManager(扫描闸门·单例)"]
    end
    subgraph Lib["settingslib (三 flavor: dcddif/xcddif/f3dif)"]
        LBM["LocalBluetoothManager<br/>+ EventManager + CachedDeviceManager"]
        CBD["CachedBluetoothDevice"]
    end
    Frag -- registerCallback --> LBM
    Scan -- triggerScan --> Utils["MiBluetoothUtils.startDiscovery"]
    Utils --> LBA["LocalBluetoothAdapter→BluetoothAdapter"]
    LBA --> FW["BluetoothAdapter(系统)"]
    FW -. ACTION_FOUND .-> LBM
    LBM -. onDeviceAdded .-> Frag

已确认关键事实(对抗核实,2026-07-23)

⚠️ 本轮二次核实推翻了多处旧认知,以下为最新金标准:

  • 三 flavor:dcddif(骁龙8295) / xcddif(玄戒A14) / f3dif(玄戒A17主线,dev_a17_0610 编译)build.gradle:59-82
  • f3dif = 纯上游 AOSPCachedBluetoothDevice.java 0 个 MICAR-PORTING 标记(xcddif 33/dcddif 10);无 isCloseAutoConnectDevice 黑名单、无半关、无 try/catch 广播保护、timeout 不翻倍。A17 MICAR 蓝牙定制全部回归。
  • CarPlay 黑名单 A17 失效(H6)disableAutoConnect 所有 flavor 都写 Settings.Secure bluetooth_close_autoconnect,但 f3dif 没人读——CarPlay 配对后仍自动连 HFP/A2DP。
  • 2956 当前未修复:commit 7239803bedev_a17_0610悬空提交(被 reset),onCancel(:283) 仍是旧版仅 cancelBondProcess,bug 仍在。核实修复用 git merge-base --is-ancestor <c> HEAD勿信 git branch --contains
  • 扫描闸门 BluetoothScanManager 单例:禁扫全仓库仅 2 处,全在 CarPlay 配对链路。
  • 设备过滤是预期设计MiBluetoothUtils.isDeviceClassTypeSupport:141-170 只显手机类(condition2 AUDIO_VIDEO 系列分支是死代码)。
  • CarPlay 设备识别:蓝牙 EIR UUID 2d8d2466-e14d-451c-88bc-7301abea291a(ConnectionUtils.kt:30-31);CarPlay 不是蓝牙 profile,数据走 WiFi;deeplink mis://complex/connect?action=carplay_connect&bt_mac=
  • CTKD 方向 BR→LE:44.855 落 BR/EDR Link Key(key_type=0x8),45.087 从 Link Key 派生 LE LTK + 存 IRK。
  • 双蓝牙上限=2(ConnectionConstants.kt:19),五处调用点三类场景。
  • 行号区分 if-check vs call:双蓝牙调用行 :90/:526/:142/:295/:111。
  • BONDED 广播被 SDP 延迟最多 3sgetBondState() 才权威(读服务侧实时态)。

已确认关键事实(2026-09-06 第四轮对抗追加)

  • f3dif 已合入 dev(推翻 2026-08-23 旧结论):git ls-files 262 文件;b57402a19(targetSdk 37 part1)触及;f3dif CachedBluetoothDevice.java 2719 行与 dev_a17_0610 同 blob。交付统一(维护者确认,2026-09-06):a17 已全面切 dev 交付,a17/xcd/dcd 三机型均走 dev 分支,旧 A17 分支仅历史参照。
  • sourceSets 5 变体(build.gradle:56-90):dcd→dcddif、xcd_cn_a14→xcddif、xcd_global_a14→xcddif+global(新增海外 A14)、xcd_cn_a17→f3dif、xcd_global_a17→f3dif+global。
  • Auracast QR 前缀不兼容:xcddif "BT:"(Utils:46) vs f3dif "BLUETOOTH:UUID:184F;"(Utils:46),两文件唯一差异;dcddif 无任何 Broadcast/LeAudio 类。详见 80 系列
  • BluetoothCallback 实现者 6 个(非 1 个):BluetoothPreferenceController(:50, 覆写8法:137-166)、BluetoothMainEntrySettingsFragment(:56)、f3dif 专属 BluetoothEventManagerExt/LocalBluetoothManagerExt/PresetUiController/AmbientVolumeUiController。详见 23

排障快速入口