Files
Obsidian/项目文档/徐工/项目md文件/codex_xugong.md
T
2026-11-05 14:35:04 +08:00

6.9 KiB

Codex Xugong

Workspace

  • Root: D:\zdCode\xugong
  • Project type: multi-module Android project
  • Main module registry: settings.gradle

Fast Start

下次进入这个项目,优先按下面顺序建立上下文,不需要全仓扫描。

  1. 先确认当前任务目标
  2. 再定位相关模块
  3. 只沿调用链读取必要代码
  4. 需要修改时,再扩展到相邻模块

推荐开场信息:

继续处理 xugong 项目
当前问题:<一句话描述>
相关模块:<模块名列表>
已知结论:<如果有,写 1-3 句>

示例:

继续处理 xugong 项目的蓝牙通讯录重复同步问题
相关模块:YX_Voice / YX_BluetoothSDK / YX_BlueTooth
已知结论:syncBtPhoneContactStatus 在连接成功后和 PBAP 通讯录下载完成后各发送了一次

Module Heuristics

当前仓库很大,但常见问题可先按职责收敛:

  • YX_Voice: 语音协议、事件上报、蓝牙状态同步到语音侧
  • YX_BluetoothSDK: 蓝牙协议、PBAP、联系人/通话记录同步
  • YX_BlueTooth: 蓝牙业务 UI、ViewModel、页面触发入口
  • YX_Lib_CommonBase: 常量、公共协议字段

如果问题和蓝牙联系人同步有关,默认先看:

  • YX_Voice/src/main/java/com/yaxon/voice/helper/VoiceEventHelper.java
  • YX_Voice/src/main/java/com/yaxon/voice/protocol/YxProtocol.java
  • YX_Voice/src/main/java/com/yaxon/voice/receiver/BluetoothMonitorReceiver.java
  • YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.java
  • YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/platform/BluetoothPbapClient.java

Current Topic

Issue

日志文件:

  • C:\Users\Administrator\Desktop\徐工日志\yx_log\2026_0513_1747_33_545.log

问题:

  • 打开蓝牙并连接手机后,syncBtPhoneContactStatus 发送了 2 次

Current Conclusion

syncBtPhoneContactStatus 的两次发送不是单纯由“蓝牙打开”触发,而是两段不同链路:

  1. 蓝牙连接成功后立即上报一次当前联系人
  2. 首次连接触发 PBAP 通讯录下载,下载完成后再次上报一次

关键日志时间点:

  • 2026-05-13 17:48:07.393 第一次发送 syncBtPhoneContactStatus
  • 2026-05-13 17:48:13.662 BtContactsManager 触发 phoneBookPullRequest
  • 2026-05-13 17:48:14.270 第二次发送 syncBtPhoneContactStatus

Relevant Code Paths

当前已确认的主要入口:

  • YX_Voice/.../YxProtocol.java
    • BLUETOOTH_CONNECT_STATUS 中调用 VoiceManager.VOICE_EVENT_HELPER.notifyContact()
  • YX_Voice/.../BluetoothMonitorReceiver.java
    • ACTION_CONTACTS_DOWNLOAD_COMPLETE 中调用 VoiceManager.VOICE_EVENT_HELPER.notifyContact()
  • YX_Voice/.../VoiceEventHelper.java
    • initNotifyBluetoothStatus() 中会补发一次 notifyContact()

联系人下载链路:

  • BtContactsManager.onPbabStatusChanged(...)
  • BluetoothPbapClient.phoneBookPullRequest(...)
  • ContactUtils.getAllContacts(...)
  • 完成后回到语音侧再触发联系人同步

Suggested Fix

优先按“数据就绪事件”而不是“连接事件”驱动联系人同步。

建议顺序:

  1. 去掉连接成功后立即 notifyContact() 的路径
  2. 保留 PBAP 下载完成后的联系人同步
  3. 保留显式查询联系人时的主动同步
  4. 给 notifyContact() 增加幂等保护

推荐幂等键:

  • activeDeviceMac
  • contactJson 的 hash

推荐规则:

  • 同一 mac
  • 同一份联系人内容

则跳过重复发送 syncBtPhoneContactStatus

Minimal Safe Change

如果只做最小改动,先改这一条:

  • 删除 YxProtocol.BLUETOOTH_CONNECT_STATUS 里的 notifyContact()

保留:

  • PBAP 下载完成广播触发的 notifyContact()
  • 手动查询联系人时触发的 notifyContact()

同时把初始化补发改成带条件:

  • 仅当当前已连接
  • 且本地已有该 mac 的联系人缓存

才补发联系人

Re-entry Notes

如果下次关闭终端后重新进入,直接:

cd D:\zdCode\xugong

然后对 Codex 说:

按 codex_xugong.md 继续

或者补一句:

按 codex_xugong.md 继续,开始改蓝牙联系人重复同步

Session Log

2026-05-13

当前分析聚焦在“蓝牙联系人同步到语音侧”的链路。

Logs Conclusion

日志文件:

  • C:\Users\Administrator\Desktop\徐工日志\yx_log\2026_0513_1747_33_545.log

结论:

  • syncBtPhoneContactStatus 确实发送了 2 次
  • 不是单纯“蓝牙打开”导致 2 次
  • 实际是:
    1. 蓝牙连接成功后先上报一次联系人
    2. PBAP 通讯录下载完成后又上报一次联系人

Uncommitted Code Review

已分析当前工作区未提交改动,重点文件:

  • YX_Voice/src/main/java/com/yaxon/voice/helper/ContactHelper.java
  • YX_Voice/src/main/java/com/yaxon/voice/helper/VoiceEventHelper.java
  • YX_Voice/src/main/java/com/yaxon/voice/protocol/BluetoothProtocol.java
  • YX_Voice/src/main/java/com/yaxon/voice/helper/BlueToothHelper.java
  • YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtSettingManager.java
  • YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.java
  • YX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtVoiceManager.java

当前未提交改动的主要目的:

  • 修复“切换不同手机后,把多个手机的通讯录一起同步给语音侧”的问题

当前结论:

  1. 这次改动的主方向是对的
  2. 关键修复已经落在“按当前活动设备 macAddress 过滤联系人”
  3. notifyContact() 不再直接读全量蓝牙联系人,而是:
    • 先取 activeDeviceMac
    • 再调用 getContactsNew(macAddress)
  4. ContactHelper.getContactsNew(macAddress) 已经对 content://com.yaxon.bluetooth.contact/table_contacts 加了:
    • selection = "macAddress = ?"
    • selectionArgs = new String[]{macAddress}
  5. 数据表列名 macAddress 已核对,和 YX_BluetoothSDK 里的数据库定义一致

这意味着:

  • “多台手机联系人混发”的问题,当前未提交代码已经基本修住

Remaining Risks

这批改动还没有解决的点:

  1. 仍可能对同一台手机重复同步 2 次联系人

    • 连接成功一次
    • PBAP 下载完成一次
  2. notifyContact() 现在强依赖 activeDeviceMac

    • 如果某个时序里先触发 notifyContact()
    • 但语音侧还没收到 cmd.syncBtActiveDeviceMac
    • 这次同步会直接跳过,日志会打印 notifyContact: no active device

Next Step

明天继续时,建议在当前基础上做这两件事:

  1. 给 notifyContact() 增加幂等保护

    • 去重键建议:macAddress + contactJson/hash
  2. 收敛联系人同步触发时机

    • 区分“连接事件”
    • 区分“PBAP 下载完成事件”
    • 避免同一份联系人重复发给语音侧

Resume Prompt

明天可直接输入:

按 codex_xugong.md 继续,基于当前未提交代码继续处理蓝牙联系人同步去重