连接知识库 · 对抗审查记录
第一轮 7 个 Explore Agent 产出后,由主控亲自 grep / 直读源码做的独立对抗核实。 凡 Agent 转述与源码冲突,以本文件为准。 核实日期:2026-07-15 · 分支 dev · HEAD 583a310c8
对抗审查价值极高——纠正 2 处 Agent 误判、确认 3 个真实 bug、抓出 1 处转述笔误。这正是”文案/数值必须直读源码、配独立对抗审查”的实践。
纠正的 Agent 错误(2 处)
❌→✅ 纠正 1:BluetoothDisconnectConfirmDialogFragment 不是”四类对话框之一”
- 配对 Agent 把它列为蓝牙”四类对话框”之一(Pairing/Picker/DisconnectConfirm/CarplayChoose)。
- 对抗核实:全仓库 grep
BluetoothDisconnectConfirmDialogFragment,除类定义内部newInstance自引用外零外部调用。 - 真相:该类是 AOSP 遗产死代码,未被 MiCar 实例化。实际”断开确认”走
AlertDialog.MiCarBuilder内联实现(BluetoothBondedDevicesPrefController.java:220-243的showDisConnectConfirmDialog)。 - 文档处理:蓝牙配对章节改为”三类对话框”(Pairing/Picker/CarplayChoose),DisconnectConfirm 标注为死代码。
❌→✅ 纠正 2:isDeviceClassTypeSupport 的 AUDIO_VIDEO 过滤不是 bug,是有意设计
- 蓝牙发现 Agent 标注”AUDIO_VIDEO major 在 condition1 即 false,导致耳机/音箱/车机音频被排除,与车机应能连耳机的直觉相反,值得 review”。
- 对抗核实(直读
MiBluetoothUtils.kt:131-160):condition1:AUDIO_VIDEO/UNCATEGORIZEDmajor →false;COMPUTER→ 非 laptop;WEARABLE→ 仅 pager;else(含 PHONE)→ truecondition2:AUDIO_VIDEO_CAR_AUDIO/HEADSET/HEADPHONES→ false;else → trueres = condition1 && condition2
- 真相:车机蓝牙扫描列表只显示手机类设备(PHONE major),屏蔽耳机/音箱/车机自身/电脑(除laptop)/可穿戴(除pager)。这是符合车机场景的预期设计——车机蓝牙主要用于手机互联(电话/通讯录/CarPlay),不连蓝牙耳机听歌(车机走本地音频)。蓝牙耳机若要配对走其他路径(手机主动/CarPlay 流程)。
- 副产物:
condition2里的耳机分支(:151-154)因condition1已 false 而成死代码(防御性冗余)。 - 文档处理:蓝牙发现章节明确写”预期行为”,并标注 condition2 耳机分支为死代码。
确认的真实问题(3 个 bug,均已带 file:line)
⚠️ Bug 1:dcddif TelephonyUtil.isSupportSatelliteByDevice 反射 receiver 传错
- 直读
settingsPage/micarConnectionSettings/src/dcddif/java/.../TelephonyUtil.kt:35-63 :43telephonyMgrExDefault = getDefaultInsMethod.invoke(null)← 正确取到 TelephonyManagerEx 实例:47isSupportSatellite = method2.invoke(_defaultMgr)← 却传了_defaultMgr(TelephonyManager 实例,非 Ex)method2是从TelephonyManagerEx类取的isSupportSatelliteByDevice,receiver 类型不匹配 →IllegalArgumentException→ catch → 返回 false- 后果:DCD 平台
isSupportSatelliteByDevice恒为 false → 卫星分组恒隐藏。对比同文件setSatelliteEnable:72-79传的是正确的telephonyMgrExDefault,证明这是笔误。 - 实际影响:取决于 DCD 平台是否真支持卫星(若本不支持则无感;若支持则真 bug),需现场验证。xcddif 版本(
:46-47)传值正确。
⚠️ Bug 2:SatelliteSettingDialog TelephonyManager 注册/解注册实例不一致
- 直读
satellite/SatelliteSettingDialog.kt :137注册:mTelephonyManager?.createForSubscriptionId(finalSubId)?.registerTelephonyCallback(...):275解注册:mTelephonyManager.unregisterTelephonyCallback(mServiceStateListener)createForSubscriptionId返回新实例,在原mTelephonyManager上 unregister 解不掉新实例上的 callback → callback 泄漏 / 解注册失败。
⚠️ Bug 3:manifest 同时注册 SATELLITE_COMMUNICATE 与 SATELLITE_COMMUNITE
- 直读
AndroidManifest.xml:109,113:同一 Activity 注册了android.settings.SATELLITE_COMMUNICATE(正确)和android.settings.SATELLITE_COMMUNITE(少一 C,拼写错误)。 - 推测:调用方某处发的是拼错的 COMMUNITE,manifest 两个都收以防漏。应统一拼写。
抓出的转述笔误(1 处,印证”Agent 转述不可信”)
- 车机互联 Agent 在能力总表里写 CarPlay 判断包名是
com.mi.car.carplay / com.desaysv.carlink。 - 对抗核实(直读
ConnectionUtils.kt:41-47):第二个包是com.desaysv.carplay(德赛西威 CarPlay),不是 carlink。 - 教训:与 2026-07-09 后屏投影知识库的经验一致——具体包名/文案/数值必须直读源码,绝不采信 Agent 转述。
互相印证(可信度高,可直接采用)
以下结论被 ≥2 个 Agent 独立指出且无矛盾,已交叉确认:
- settingslib 源码位于
base/settingsLibAndroid/src/{dcddif,xcddif}/java/com/android/settingslib/bluetooth/(蓝牙发现 + 配对 Agent,CachedBluetoothDevice.startPairing 行号 613 一致) - 双 flavor 机制:
TelephonyUtil/WifiPickerTracker工厂 /LocalBluetoothAdapter均有 dcddif + xcddif 两套(连接框架 + WLAN + 蓝牙发现 + 车机互联 Agent) - 手车互联能力判断全靠包名预装(连接框架 + 车机互联 Agent,包名清单一致)
- DCD 平台 =
ro.board.platform == msmmnile(连接框架 + 车机互联 Agent) - 蓝牙扫描持续循环、mIsControllerActive 双检、解配设备一次性拦截(3 个蓝牙 Agent 一致)
第二轮:蓝牙知识库 2.0 对抗(2026-07-23)
14 篇新文档 + 02 修订 + README 改造。每篇 fan-out 调研 Agent → 独立对抗审查 Agent → 主控亲自 grep/直读 bugreport Review → 落库。对抗价值极高——纠正主控 1 处核实错误、抓出 5 处技术错误、补 3 处遗漏。
🚨→✅ 纠正主控核实错误(1 处,最关键)
- 主控称”2956 已修复(commit 7239803be)“——对抗推翻:31/41 对抗审查用
git merge-base --is-ancestor 7239803be HEAD(返回非祖先) +git fsck(dangling) + 直读 onCancel(旧版) 证实 7239803be 是悬空提交,已被 reset,bug 仍在。主控此前被git branch --contains(受本地 reflog 影响)和某次 sed 读取误导。教训:核实 commit 合入用merge-base --is-ancestor,勿信branch --contains;落库前直读当前文件内容。已修正 10/11/12/20/22 五篇 + 41/31 的”已修复”表述。
🚨 对抗抓出的技术错误(5 处)
- CTKD 方向写反(11 对抗):草稿”LTK 经经典通道分发”,实际 BR→LE 派生(
smp_calculate_long_term_key_from_link_key@45.087);44.855 落 Link Key vs 45.087 派生 LTK(root-cause.md §4.1 同步纠正)。 - PAN isAutoConnectable 误记 true(12 对抗):实为 false(PanProfile 三 flavor)。
- ACTION_PAIRING_REQUEST 归属误植 AdapterService(20 对抗):实为 BondStateMachine(:516/:659)。
- CarPlay deeplink 笔误(33 调研自纠):
connection://carplay&bt_mac=→mis://complex/connect?action=carplay_connect&bt_mac=(ConnectionConstants:5-6)。 - 行号 if-check vs call 混用(32 对抗):双蓝牙”调用点”用判定行,改调用行 :90/:526/:142/:295/:111。
➕ 对抗补出的遗漏(3 处)
- 双蓝牙第五拦截点(32 对抗):02 文档”三处”漏
BluetoothBondedDevicesPrefController:295(主页已配对点连接),实为五处。 - CarPlay 黑名单清除第五路径(33 对抗):漏
BluetoothUnbondedDevicesPrefController:517(点未配对设备先清黑名单)。 - f3dif 广播数差异(21 对抗):f3dif 20 个广播(新增 AUTO_ON),vs xcddif 29 / dcddif 18。
🔬 对抗交叉印证(高可信)
- f3dif = 纯 AOSP、黑名单失效:21/31/33 三篇对抗独立印证(0 MICAR-PORTING 标记、无 isCloseAutoConnectDevice、onBondingStateChanged:1147 双参直 connect)。这是 A17 主线真实回归风险(H6)。
- BondStateMachine SDP 延迟:20 对抗读 AOSP 源码确认 :583 “wait for SDP complete”、3000ms 超时。
互相印证(≥2 Agent 无矛盾)
- isDeviceClassTypeSupport:141-170、CarPlay UUID ConnectionUtils:30-31、双蓝牙上限=2、2956 时间线(多 Agent 一致)。
f3dif 三个 flavor 行号勘误(21 对抗三栏,落库必引)
| 项目 | dcddif | xcddif | f3dif(A17主线) |
|---|---|---|---|
| BluetoothEventManager 广播数 | 18 | 29 | 20 |
| BluetoothCallback 方法数 | 10 | 15 | 11 |
| onBondingStateChanged | 单参:839 | 单参:1050 | 双参:1147 |
| isCloseAutoConnectDevice | :821/:853 | :1032/:1079 | 不存在 |
| MICAR-PORTING 标记 | 10 | 33 | 0(纯AOSP) |
| connect 链终点 | adapter:402 | mDevice:544 | mDevice:611 |
第三轮:60 系列 CachedBluetoothDevice 精讲 对抗(2026-08-20)
对象:
蓝牙/60-CachedBluetoothDevice精讲篇/(60-68 共 9 篇,2026-08-20 新建)。 方法:3 个红队 Agent 并行逐章核查——V1 核 60-63(抽查 210 处)、V2 核 64-67(约 180 处)、V3 核 68 案例事实(对照 jira-data/{KEY}/analysis/root-cause.md 原文)。全部发现已落稿修正。
核查统计
| 红队 | 范围 | 抽查 | 属实 | P0 | P1 | P2/P3 |
|---|---|---|---|---|---|---|
| V1 | 60-63 章 | 210 | 188 | 2 | 12 | 8 |
| V2 | 64-67 章 | ~180 | ~160 | 2 | 3 | 14 |
| V3 | 68 案例卡 | 8 案例 | 6 忠实 | 0 | 2 | 4 |
| 合计 | 9 章 | ~570 | ~89% | 4 | 17 | 26 |
❌→✅ 纠正的 P0(4 处,均已改稿)
- “五个诞生入口”→四个(V1):
ActiveDeviceChangedHandler(BEM:135-140 注册)不是诞生入口——findDevice 结果直接交 dispatch 做音频路由(HADM:485),全程无 addDevice;全 BEM 仅 4 处mDeviceManager.addDevice(:212/:375/:438/:590)。63 章已改四入口 + 反面澄清框。 - CBDM synchronized 计数(V1):正文”13 个方法”与括号 19 个行号自相矛盾;实测 20 个 synchronized 方法 + addDevice 内 1 个块(:139),列表补 :368。63 章已改。
- setEnabled 行为(V2):64 章草稿”开=已连接时顺手触发连接”是老 AOSP
setPreferred残留语义——逐一核对 7 个 profile 的 setEnabled 全部只写 connectionPolicy,零连接触发。已改为”幂等写保护”表述并加 7 profile 核对结论。 - 不存在的方法名(V2):
getBtClassDrawableWithFallback在三 flavor 全仓 0 命中=方法不存在(空洞真);实际存在的是BluetoothUtils.getBtClassDrawableWithDescription(:157,CBD:2605 在用)。65 章已改并加”别按老资料找”警示。
P1 级要点(17 处,均已改稿)
- V3:3187 摘要三分支 :104 是”正在连接”非 else(else 在 :106);2960”关开恢复”系 root-cause 标记的待证候选(两解释分叉),不得写成定论。
- V1:CBDM 构造行号对调(HearingAid :64-65 / Csip :66-67);组管理器自身无锁(CsipDeviceManager 0 个 synchronized),串行化靠 CBDM 持锁调用;syncBluetoothState :245-252;xcddif 早退 :274;:330 非 :331;DC:811 非 :812;构造 :230-242;setRssi :991-996;HADM init :274-297。
- V2:performConnect 两行号(:17/:19);PBAP 可见判据 :68-69;getBtDrawable kt:328-353(else :349-350)。
- V3 案例术语:3205 机制是 isBusy 含 DISCONNECTING(“防抖放行”属 3950);“出局式”= outgoing 非 out-of-band/OOB。
教训(写给下一轮写文档的自己)
- 计数枚举型断言(“N 个入口/方法/字段”)必须先 grep 再落笔——本轮 4 个 P0 有 3 个是这类。
- 引用方法名前 grep 确认存在——老资料/记忆里的 API 名(getBtClassDrawableWithFallback、connectAllEnabledProfiles)在新基线可能已不存在或改名。
- 行为断言(“开=顺手连”)要逐实现类核对,不能凭接口语义或旧版记忆外推。
- 案例的”待证”结论必须带着”待证”标签转述——写成定论会污染下游读者。
- 案例行号漂移是常态(1922 的 :316 与 134132 的 :331 是同一调用点)——已在 68 章头部加行号时效声明。
第四轮:80 系列 + 23 章 对抗(2026-09-06)
对象:新建
蓝牙/80-Auracast广播QR篇/(80/81 两篇 + 篇内记录)+20-Android框架篇/23-BluetoothCallback契约与接入指南.md+ README/22/51/基准的事实修正。 方法:主控 session 亲读源码(BluetoothBroadcastUtils、BluetoothLeBroadcastMetadataExt 全文)后出 12 条声明,1 个红队 agent 盲核(不接触主控推理),全部 PASS 才落稿。
核查统计
| 范围 | 声明 | PASS | FAIL |
|---|---|---|---|
| flavor/build(C1-C2) | 2 | 2 | 0 |
| QR 链路(C3-C6、C11) | 5 | 5 | 0 |
| Callback/EventManager(C7-C10) | 4 | 3 | 1 |
| 基线行数(C12) | 1 | 1 | 0 |
❌→✅ 纠正的 P0(1 处)
- “BluetoothPreferenceController 是除 EventManager 外唯一实现”为假(C10):全仓另有 5 个实现——
BluetoothMainEntrySettingsFragment.java:56(主源集)、f3dif 专属BluetoothEventManagerExt.kt:28(object : 写法)、LocalBluetoothManagerExt.kt:28、hearingdevices/ui/PresetUiController.kt:66(字段持有匿名实现)、AmbientVolumeUiController.java:63(多接口 implements 列表)。主控旧 grep 模式implements BluetoothCallback|BluetoothCallback>漏掉 Kotlinobject :与逗号分隔的多接口声明。23 章 §3 已按 6 实现者落稿。
措辞精确化(2 处,均已按此落稿)
mCallbacks(xcddif BluetoothEventManager:71)声明类型是Collection<BluetoothCallback>,实例化为 CopyOnWriteArrayList——表述用”声明 Collection/实例 COW”。- f3dif 的
build.gradle:88aidl.srcDirs 指向src/main/aidl(其余 flavor 为src/main/java),细节差异记录在案。
本轮基础事实修正(写入 README/22/基准)
- f3dif 已合入 dev(262 文件;b57402a19 触及 3 个);f3dif CachedBluetoothDevice.java 与 dev_a17_0610 同 blob(d19660e0…)→ 60 系列 f3dif 行号在 dev 可复用,推翻 2026-08-23 旧结论。
- sourceSets 5 变体(build.gradle:56-90),新增 xcd_global_a14→xcddif+global。
- Auracast QR:Utils 仅 xcddif/f3dif;SCHEME 前缀
"BT:"vs"BLUETOOTH:UUID:184F;"(各自 :46,两文件唯一差异);dcddif 无任何 Broadcast/LeAudio 类。
教训(写给下一轮)
- 找接口实现者,单一 grep 模式必然漏:
implements X漏掉object : X(Kotlin)与implements A, B, X(多接口)与字段类型声明。至少三模式组合:implements X/object : X/X>。本轮唯一 FAIL 即此。 - “某分支独有”类结论有保质期:分支合并(f3dif→dev)会让旧警告失效;复核用
git ls-files+ blob 哈希比对(git rev-parse branch:path),别只看目录存在与否。 - 声明先行、盲核在后:把结论拆成可证伪的 C1-Cn 再交红队,比”帮我审一下文档”有效得多——FAIL 的那条正是被拆解后暴露的。
第五轮:CachedBluetoothDeviceManager 坑位 对抗(2026-09-06)
对象:42 章新增 §7 + 63 章两处带日期增补 + 基准 §8。 方法:主控亲读 CBDM 全文(xcddif 581 行)出 9 条声明,1 个红队 agent 盲核。
核查统计
9/9 PASS,无 FAIL/PARTIAL。
本轮特色:先查重再入库
- 入库前先 grep 知识库既有覆盖:9 条里”clearNonBondedSubDevices 首组 return”与”onDeviceDisappeared 死码”63 章已记(:183/:146),不重复落稿,只写增量(onScanningStateChanged 同款 return、xcddif 版事实)。
- 红队补充事实升级定性:
clearAllDevices仅 xcddif 定义(dcddif/f3dif 无此方法)——“死码”升级为”xcddif 独有死码”。
措辞精确化(落稿已按此)
- 不对称范围收窄:仅 CSIP 组员两方向不对称;助听 subDevice 两方向对称(:407-417)。
- C9 分支实为
!= BOND_NONE而非== BONDED(语义等价,42 §7.5 已标注)。 - C3 有一处注释级误命中(MiBluetoothPickerDialogFragment.kt:119,注释提及非调用),不计调用点。
教训
- “级联解配对”这类行为结论必须标 flavor——f3dif 与 xcddif 同名方法已分叉,63:200 旧表述对 xcddif 不准确,本轮已加注。
- 查重先行省一次重复落稿(本轮 4 个候选新点砍掉 1 个已覆盖的)。