dev vs dev_a17_0610 蓝牙代码差异报告
产出日期:2026-07-24 | 分析方法:
git diff dev_a17_0610 dev(主控直读 + 3 Agent 并行 + 对抗审查) 目的:为后续蓝牙新功能优化提供差异基线与优先级建议 关联:00-蓝牙-README、01-蓝牙-发现流程、现有知识库均基于 dev 现状 建立
0. 执行摘要(TL;DR)
核心结论(与通常预期相反):在蓝牙模块,dev_a17_0610 的实现全面领先 dev。a17 独立做过一轮「AOSP 对齐 + 健壮性加固」,dev 主线尚未同步。因此「新功能优化」的主要方向不是 dev→a17 迁移,而是 a17→dev 回流。
蓝牙差异可清晰分为三层:
| 层 | 范围 | 性质 | 文件数 |
|---|---|---|---|
| A. 核心功能 | settingsPage/micarConnectionSettings/.../miauto/bluetooth/ | a17 加固 8 项 + dev 可借鉴 4 项 | 14 (全 M) |
| B. 平台 flavor | base/settingsLibAndroid/src/f3dif/ | a17 新增「上游 AOSP settingslib」源集(含 LE Audio/助听/设备级设置新能力) | 整片目录 |
| C. 零差异 | dcddif/xcddif settingslib bluetooth + 周边(hook/Mac/Permission/manifest/xml) | 字节级一致 | 0 |
关于 f3dif(纠正一个常见误判):f3dif 不是未接线的死代码。a17 的 base/settingsLibAndroid/build.gradle 用 productFlavors,其中 xcd_cn_a17/xcd_global_a17 两个 A17 平台 flavor 的 sourceSets 明确绑定 src/f3dif/java(line 68-77)——即编译 A17 平台时 f3dif 就是实际产物。
flowchart LR subgraph dev[dev 分支 flavor=dcd/xcd] A1[dcddif 老版精简 settingslib] A2[xcddif 中等 settingslib<br/>含 LE Audio profile] end subgraph a17[dev_a17_0610 flavor=xcd_cn_a17/xcd_global_a17] B1[dcddif 字节同 dev] B2[xcddif 字节同 dev] B3[f3dif 上游 AOSP settingslib<br/>52类 含助听/设备级设置<br/>a17 实际编译源集] end A1-.零差异.->B1 A2-.零差异.->B2 B3 -.- |dev 完全不存在| A3[❌]
1. 分析方法与噪声排除
diff 方向约定:git diff dev_a17_0610 dev
+行 = dev 的内容 |-行 = a17 的内容(a17 独有、dev 删掉的)
已排除的「伪差异」噪声(不写进结论):
- 包名拼写:dev 用错拼
com.android.car.setings(少个 t),a17 修正为com.android.car.settings。 - import 顺序/空行/纯注释/格式化。
- manifest
package属性补齐(AGP8.4 允许不写,由 namespace 提供)。 - f3dif 整片目录增删(平台 flavor 维度,单独在 B 层分析)。
对抗审查记录:本轮抓出并纠正 1 处 Agent 误判——「f3dif 未被构建启用」。实证 build.gradle line 68-77 证明 f3dif 绑定到 xcd_cn_a17/xcd_global_a17 flavor,是 a17 实际编译源集。
2. 核心发现 A:miauto/bluetooth 14 个文件
路径前缀:settingsPage/micarConnectionSettings/src/main/java/com/android/car/settings/miauto/bluetooth/
2.1 a17 独有的健壮性加固(8 项 —— dev 应回流,按价值排序)
| # | 加固点 | 涉及文件 | dev 现状(潜在 bug 场景) | a17 实现 |
|---|---|---|---|---|
| 1 | AlwaysDiscoverable 持续可发现 | MiBluetoothUtils.kt | 扫描期间被系统改模式后不自动恢复 DISCOVERABLE | 内部 BroadcastReceiver 监听 ACTION_SCAN_MODE_CHANGED 自动恢复,对齐 AOSP |
| 2 | startDiscovery 递归循环守卫 | MiBluetoothUtils.kt + BluetoothScanManager.kt | stopDiscovery→cancelDiscovery→DISCOVERY_FINISHED→triggerScan 递归;高频 trigger 冗余扫描 | isDiscovering() 幂等守卫,已扫则 skip |
| 3 | 实时 getBondedDevices() 替代缓存 | MiBluetoothUtils.kt + BluetoothOperationsController.java + NewBluetoothDevicePreference.java | 应用重启后 cachedDevice.bondState 过期(返回 BOND_NONE),误判已配对设备 | getAdapter().bondedDevices.contains() 实时查系统 |
| 4 | DeadObjectException 防崩溃 | BluetoothSwitchController.java | 蓝牙服务死亡时 setScanMode 抛异常崩溃 | try-catch(Exception) 包裹 |
| 5 | 未配对列表缓存重建 | BluetoothUnbondedDevicesPrefController.java | DeviceFoundHandler 对已缓存设备不触发 onDeviceAdded → 列表可能为空 | 从 CachedBluetoothDeviceManager 缓存重建(对齐 AOSP updateState) |
| 6 | 配对中抑制扫描 | BluetoothUnbondedDevicesPrefController.java | 配对进行中触发扫描会打断配对/列表错乱 | 遍历 mPreferenceMap 检测 BOND_BONDING,有则跳过 triggerScan;重建时也跳过 |
| 7 | connecting 态透传链 | BluetoothBondedDevicesPrefController + NewBluetoothDevicePreference + MiCarBluetoothBondedDevicePreference | 「连接中」UI 状态不精准(单条件 busy 误显示) | setConnecting(state==CONNECTING) 透传 + 双条件判断 |
| 8 | SDK_INT > 34 分支 | BluetoothUnbondedDevicesPrefController.java | 无 Android 15+(API 35+) 适配 | scan 统一交由 onScanningStateChanged 接管 |
注:第 3 项同时印证 01-蓝牙-发现流程 描述的 dev 发现链
LocalBluetoothAdapter.startScanning(true)在 a17 已被标准BluetoothAdapter.startDiscovery()+ AlwaysDiscoverable 取代。
2.2 dev 独有的可借鉴改动(4 项 —— 可考虑同步 a17,均为小改)
| # | 改动 | 文件 | 说明 |
|---|---|---|---|
| 1 | 配对对话框基类统一 | MiBluetoothPairingDialog.kt | 收敛到 CarUIAlertDialog,移除 CarUIAlertDialogForKotlin 专用变体 |
| 2 | 配对 Activity 入口集中查询 | MiBluetoothPairingDialogActivity.kt | handlePairingIntent 一次 findDevice 缓存复用 + 双重空判早退(替代每次点击临时查) |
| 3 | 设备详情页正式磨砂背景 | MiCarBluetoothDeviceDetailFragment.java | ViewShadowUtils.setBlurAndBlend 高斯模糊(替代 a17 对 f3 平台的纯色临时兜底;前提:f3 已修好背景加载) |
| 4 | LocalBluetoothAdapter 包装统一 | BluetoothStateController + BluetoothMainEntrySettingsFragment + MiBluetoothUtils | 多处原始 BluetoothAdapter 切到 SettingsLib 包装(架构一致性,但 a17 用 MiBluetoothUtils.getAdapter() 也达统一入口) |
注:第 3 项 a17 的注释原文「A17 f3设备上未加载出背景,先临时增加颜色」——这是 a17 为 f3 平台加的 临时 workaround,dev 是正式实现。
2.3 纯风格差异(无功能影响,不列入建议)
MiBluetoothPairingController.kt:CompoundButton?可空参数 vs?.let{}安全调用 —— 功能等价(setPin本接受可空入参)。- 大量
MLog日志增减(调试用)。
3. 核心发现 B:f3dif = A17 平台上游 settingslib
3.1 flavor 绑定真相(build.gradle 实证)
base/settingsLibAndroid/build.gradle 的 productFlavors 与 sourceSets 绑定:
| flavor | 绑定源集 | 平台 |
|---|---|---|
dcd | dcddif | DCD(msmnile) |
xcd_cn_a14 | xcddif | XCD Android 14 |
xcd_cn_a17 | f3dif | XCD Android 17 国内 |
xcd_global_a17 | f3dif + global | XCD Android 17 海外 |
- dev 的 app flavor 是
dcd/xcd(绑 dcddif/xcddif),没有 a17 flavor。 - a17 的 app flavor 是
xcd_cn_a17/xcd_global_a17(绑 f3dif)。 - 结论:编译 A17 平台产物时,settingslib 走 f3dif;编译 dev/XCD 平台走 xcddif。f3dif 是 a17 的实际编译源集,非死代码。
3.2 f3dif 引入的新蓝牙能力(dcddif/xcddif 都没有)
f3dif 是上游 AOSP 主线 settingslib 快照(2024-2025 版权),比 xcddif 多 9 个 Kotlin Ext 协程封装类(把回调式 settingslib 改造为 Flow 式),并新增两个完整能力子目录:
① devicesettings/(45 文件)—— 设备级配置
- 6 个 AIDL(
IDeviceSettingsProviderService等) + Preference UI + Kotlin data 层 - Android 14+ 引入的「为每个蓝牙设备提供自定义设置页」框架,OEM 可下发配置
② hearingdevices/—— 助听设备
PresetController.kt:基于BluetoothHapClient+BluetoothCsipSetCoordinator实现助听器预设切换AmbientVolumeController.java:基于android.bluetooth.AudioInputControl(Android 15 新 GATT LE Audio API)实现环境音量- 含完整 UI(
AmbientVolumeUi/PresetUi) + metrics
③ LE Audio Sharing 增强:BluetoothUtils.java 多出 audioSharingHysteresisModeFix flag、BluetoothLeBroadcastReceiveState 等。
3.3 f3dif 缺失类警告
f3dif 比 xcddif 缺少 4 个类(DeviceGroupClientProfile/DunServerProfile/HearingAidStatsLogUtils/VcpProfile)。若把 f3dif 能力移植到 dev 线,需按需补齐,避免功能回退。
4. 核心发现 C:零差异层
| 范围 | 结论 | 证据 |
|---|---|---|
settingslib dcddif/bluetooth/ | 字节级一致 | git diff --stat = 空,27 vs 27 类 |
settingslib xcddif/bluetooth/ | 字节级一致 | git diff --stat = 空,45 vs 45 类 |
| qualitytools 蓝牙 hook(2 文件) | 零差异 | 不沾历史包名噪声 |
| BluetoothMacAddressPreferenceController | 零差异 | — |
| BluetoothRequestPermissionActivity | 零差异 | — |
| manifest 蓝牙权限(BLUETOOTH/ADMIN/PRIVILEGED) | 三项权限完全一致,无组件增删 | git diff **/AndroidManifest.xml | grep bluetooth = 空 |
| 蓝牙 xml 页面(3 个 fragment) | 逐字节一致 | 无设置项入口增删 |
即:蓝牙「周边适配层」两分支完全同步,新功能无需为兼容 a17 旧版本做额外处理。
5. 新功能优化建议(按优先级)
🔴 P0:a17→dev 回流 8 项健壮性加固(修真实 bug)
这是最高价值方向。当前分支 rls-xcd-u-mp-26-v6.0 与 dev 同源,可直接吃到这批修复:
| 优先级 | 加固点 | 修复的 bug 场景 |
|---|---|---|
| P0-1 | 实时 getBondedDevices(第3项) | 应用重启后配对状态不同步、误判已配对为未配对 |
| P0-2 | 配对中抑制扫描(第6项) | 配对时扫描打断配对、列表错乱 |
| P0-3 | startDiscovery 递归守卫(第2项) | 高频扫描递归/冗余扫描、CPU 占用 |
| P0-4 | DeadObjectException 保护(第4项) | 蓝牙服务死亡导致 Settings 崩溃 |
| P0-5 | AlwaysDiscoverable(第1项) | 扫描中可发现模式被系统回收 |
| P0-6 | 未配对列表缓存重建(第5项) | 已缓存设备不刷新导致列表空 |
| P0-7 | connecting 态透传(第7项) | 「连接中」UI 状态误显示 |
| P0-8 | SDK>34 分支(第8项) | Android 15+ 扫描行为适配 |
⚠️ 回流关键前提:a17 核心模块用标准 BluetoothAdapter(via BluetoothManager),dev 用 LocalBluetoothAdapter 反射(为兼容 XCD/DCD 平台)。backport 时必须验证标准 BluetoothAdapter API 在 dev 目标平台(XCD/DCD)可用,否则需保留 LocalBluetoothAdapter 兼容层、只移植逻辑守卫部分。
🟡 P1:评估 f3dif 上游能力上 dev 线
| 能力 | 价值 | 落地路径 |
|---|---|---|
| LE Audio Sharing | 车载音频新标准 | 移植 f3dif BluetoothUtils LE Audio 部分 + 补缺失类 |
| 助听设备(HAP) | 无障碍合规 | 移植 hearingdevices/ 子目录 |
| 设备级设置 | OEM 定制设备设置页 | 移植 devicesettings/ 子目录 + AIDL |
落地复杂度高(需同时移植 settingslib 层 + 解决 4 个缺失类 + build.gradle flavor 调整),建议按业务需求单独立项。
🟢 P2:dev→a17 同步 4 项小重构
MiBluetoothPairingDialog 基类统一 / PairingDialogActivity 缓存复用 / 详情页磨砂背景(f3 修好后) / LocalBluetoothAdapter 包装统一。走标准 dev→a17 增量迁移(patch-id 排除法,见 dev-to-a17-merge-workflow)。
6. 附录
6.1 复验命令
# 核心功能 diff(滤噪)
git diff dev_a17_0610 dev -- \
settingsPage/micarConnectionSettings/src/main/java/com/android/car/settings/miauto/bluetooth/ \
| grep -vE "import |com\.android\.car\.setings"
# f3dif flavor 绑定
git show dev_a17_0610:base/settingsLibAndroid/build.gradle | sed -n '15,77p'
# 零差异验证
git diff dev_a17_0610 dev --stat -- \
base/settingsLibAndroid/src/dcddif/java/com/android/settingslib/bluetooth/ \
base/settingsLibAndroid/src/xcddif/java/com/android/settingslib/bluetooth/6.2 14 个核心文件清单(M 状态)
BluetoothScanManager.kt / MiBluetoothPairingController.kt / MiBluetoothUtils.kt /
controller/:BluetoothBondedDevicesPrefController / BluetoothOperationsController / BluetoothStateController / BluetoothSwitchController / BluetoothUnbondedDevicesPrefController /
preference/:MiCarBluetoothBondedDevicePreference / NewBluetoothDevicePreference /
view/:BluetoothMainEntrySettingsFragment / MiBluetoothPairingDialog / MiBluetoothPairingDialogActivity / MiCarBluetoothDeviceDetailFragment
6.3 关键路径
- f3dif 蓝牙根:
base/settingsLibAndroid/src/f3dif/java/com/android/settingslib/bluetooth/ - f3dif 设备级设置:
.../bluetooth/devicesettings/ - f3dif 助听设备:
.../bluetooth/hearingdevices/ - flavor 绑定:
base/settingsLibAndroid/build.gradle:68-77