蓝牙知识库 · 总索引
模块根: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框架篇
30-模块流程篇(业务流程)
文档 主题 核心问题 01-蓝牙-发现流程 扫描/Discovery ★用户关注;扫描闸门;持续扫描循环 02-蓝牙-配对流程 pair/bond+对话框 三类对话框;CarPlay 二次弹窗;含 2956 广播延迟修正 03-蓝牙-设备详情与状态控制 详情页+开关 详情页极简(仅PBAP);开关 UI 先行+防抖 31-连接与自动连接策略 自动连接/回连/黑名单 connect 链三 flavor;last device;★H6 f3dif 黑名单失效 32-双蓝牙上限与Picker DOUBLE_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-排障实战篇
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 新增)
80-Auracast广播QR篇(广播音频扫码链路,2026-09-06 新增)
文档 主题 核心问题 80-总览与链路地图 Utils→Ext→LocalBluetoothLeBroadcastMetadata flavor 能力矩阵;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 = 纯上游 AOSP :CachedBluetoothDevice.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 7239803be 在 dev_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 延迟最多 3s :getBondState() 才权威(读服务侧实时态)。
已确认关键事实(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 。
排障快速入口