dev vs dev_a17_0610 蓝牙代码差异报告

产出日期:2026-07-24 | 分析方法:git diff dev_a17_0610 dev(主控直读 + 3 Agent 并行 + 对抗审查) 目的:为后续蓝牙新功能优化提供差异基线与优先级建议 关联:00-蓝牙-README01-蓝牙-发现流程、现有知识库均基于 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. 平台 flavorbase/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.gradleproductFlavors,其中 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 删掉的)

已排除的「伪差异」噪声(不写进结论):

  1. 包名拼写:dev 用错拼 com.android.car.setings(少个 t),a17 修正为 com.android.car.settings
  2. import 顺序/空行/纯注释/格式化
  3. manifest package 属性补齐(AGP8.4 允许不写,由 namespace 提供)。
  4. 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 实现
1AlwaysDiscoverable 持续可发现MiBluetoothUtils.kt扫描期间被系统改模式后不自动恢复 DISCOVERABLE内部 BroadcastReceiver 监听 ACTION_SCAN_MODE_CHANGED 自动恢复,对齐 AOSP
2startDiscovery 递归循环守卫MiBluetoothUtils.kt + BluetoothScanManager.ktstopDiscovery→cancelDiscovery→DISCOVERY_FINISHED→triggerScan 递归;高频 trigger 冗余扫描isDiscovering() 幂等守卫,已扫则 skip
3实时 getBondedDevices() 替代缓存MiBluetoothUtils.kt + BluetoothOperationsController.java + NewBluetoothDevicePreference.java应用重启后 cachedDevice.bondState 过期(返回 BOND_NONE),误判已配对设备getAdapter().bondedDevices.contains() 实时查系统
4DeadObjectException 防崩溃BluetoothSwitchController.java蓝牙服务死亡时 setScanMode 抛异常崩溃try-catch(Exception) 包裹
5未配对列表缓存重建BluetoothUnbondedDevicesPrefController.javaDeviceFoundHandler 对已缓存设备不触发 onDeviceAdded → 列表可能为空CachedBluetoothDeviceManager 缓存重建(对齐 AOSP updateState)
6配对中抑制扫描BluetoothUnbondedDevicesPrefController.java配对进行中触发扫描会打断配对/列表错乱遍历 mPreferenceMap 检测 BOND_BONDING,有则跳过 triggerScan;重建时也跳过
7connecting 态透传链BluetoothBondedDevicesPrefController + NewBluetoothDevicePreference + MiCarBluetoothBondedDevicePreference「连接中」UI 状态不精准(单条件 busy 误显示)setConnecting(state==CONNECTING) 透传 + 双条件判断
8SDK_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.kthandlePairingIntent 一次 findDevice 缓存复用 + 双重空判早退(替代每次点击临时查)
3设备详情页正式磨砂背景MiCarBluetoothDeviceDetailFragment.javaViewShadowUtils.setBlurAndBlend 高斯模糊(替代 a17 对 f3 平台的纯色临时兜底;前提:f3 已修好背景加载)
4LocalBluetoothAdapter 包装统一BluetoothStateController + BluetoothMainEntrySettingsFragment + MiBluetoothUtils多处原始 BluetoothAdapter 切到 SettingsLib 包装(架构一致性,但 a17 用 MiBluetoothUtils.getAdapter() 也达统一入口)

注:第 3 项 a17 的注释原文「A17 f3设备上未加载出背景,先临时增加颜色」——这是 a17 为 f3 平台加的 临时 workaround,dev 是正式实现。

2.3 纯风格差异(无功能影响,不列入建议)

  • MiBluetoothPairingController.ktCompoundButton? 可空参数 vs ?.let{} 安全调用 —— 功能等价(setPin 本接受可空入参)。
  • 大量 MLog 日志增减(调试用)。

3. 核心发现 B:f3dif = A17 平台上游 settingslib

3.1 flavor 绑定真相(build.gradle 实证)

base/settingsLibAndroid/build.gradleproductFlavorssourceSets 绑定:

flavor绑定源集平台
dcddcddifDCD(msmnile)
xcd_cn_a14xcddifXCD Android 14
xcd_cn_a17f3difXCD Android 17 国内
xcd_global_a17f3dif + globalXCD 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-3startDiscovery 递归守卫(第2项)高频扫描递归/冗余扫描、CPU 占用
P0-4DeadObjectException 保护(第4项)蓝牙服务死亡导致 Settings 崩溃
P0-5AlwaysDiscoverable(第1项)扫描中可发现模式被系统回收
P0-6未配对列表缓存重建(第5项)已缓存设备不刷新导致列表空
P0-7connecting 态透传(第7项)「连接中」UI 状态误显示
P0-8SDK>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