6.9 KiB
6.9 KiB
Codex Xugong
Workspace
- Root:
D:\zdCode\xugong - Project type: multi-module Android project
- Main module registry:
settings.gradle
Fast Start
下次进入这个项目,优先按下面顺序建立上下文,不需要全仓扫描。
- 先确认当前任务目标
- 再定位相关模块
- 只沿调用链读取必要代码
- 需要修改时,再扩展到相邻模块
推荐开场信息:
继续处理 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.javaYX_Voice/src/main/java/com/yaxon/voice/protocol/YxProtocol.javaYX_Voice/src/main/java/com/yaxon/voice/receiver/BluetoothMonitorReceiver.javaYX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.javaYX_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 的两次发送不是单纯由“蓝牙打开”触发,而是两段不同链路:
- 蓝牙连接成功后立即上报一次当前联系人
- 首次连接触发 PBAP 通讯录下载,下载完成后再次上报一次
关键日志时间点:
2026-05-13 17:48:07.393第一次发送syncBtPhoneContactStatus2026-05-13 17:48:13.662BtContactsManager触发phoneBookPullRequest2026-05-13 17:48:14.270第二次发送syncBtPhoneContactStatus
Relevant Code Paths
当前已确认的主要入口:
YX_Voice/.../YxProtocol.javaBLUETOOTH_CONNECT_STATUS中调用VoiceManager.VOICE_EVENT_HELPER.notifyContact()
YX_Voice/.../BluetoothMonitorReceiver.javaACTION_CONTACTS_DOWNLOAD_COMPLETE中调用VoiceManager.VOICE_EVENT_HELPER.notifyContact()
YX_Voice/.../VoiceEventHelper.javainitNotifyBluetoothStatus()中会补发一次notifyContact()
联系人下载链路:
BtContactsManager.onPbabStatusChanged(...)BluetoothPbapClient.phoneBookPullRequest(...)ContactUtils.getAllContacts(...)- 完成后回到语音侧再触发联系人同步
Suggested Fix
优先按“数据就绪事件”而不是“连接事件”驱动联系人同步。
建议顺序:
- 去掉连接成功后立即
notifyContact()的路径 - 保留 PBAP 下载完成后的联系人同步
- 保留显式查询联系人时的主动同步
- 给
notifyContact()增加幂等保护
推荐幂等键:
activeDeviceMaccontactJson的 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 次
- 实际是:
- 蓝牙连接成功后先上报一次联系人
- PBAP 通讯录下载完成后又上报一次联系人
Uncommitted Code Review
已分析当前工作区未提交改动,重点文件:
YX_Voice/src/main/java/com/yaxon/voice/helper/ContactHelper.javaYX_Voice/src/main/java/com/yaxon/voice/helper/VoiceEventHelper.javaYX_Voice/src/main/java/com/yaxon/voice/protocol/BluetoothProtocol.javaYX_Voice/src/main/java/com/yaxon/voice/helper/BlueToothHelper.javaYX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtSettingManager.javaYX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtContactsManager.javaYX_BluetoothSDK/src/main/java/com/yaxon/bluetoothsdk/modules/BtVoiceManager.java
当前未提交改动的主要目的:
- 修复“切换不同手机后,把多个手机的通讯录一起同步给语音侧”的问题
当前结论:
- 这次改动的主方向是对的
- 关键修复已经落在“按当前活动设备
macAddress过滤联系人” notifyContact()不再直接读全量蓝牙联系人,而是:- 先取
activeDeviceMac - 再调用
getContactsNew(macAddress)
- 先取
ContactHelper.getContactsNew(macAddress)已经对content://com.yaxon.bluetooth.contact/table_contacts加了:selection = "macAddress = ?"selectionArgs = new String[]{macAddress}
- 数据表列名
macAddress已核对,和YX_BluetoothSDK里的数据库定义一致
这意味着:
- “多台手机联系人混发”的问题,当前未提交代码已经基本修住
Remaining Risks
这批改动还没有解决的点:
-
仍可能对同一台手机重复同步 2 次联系人
- 连接成功一次
- PBAP 下载完成一次
-
notifyContact()现在强依赖activeDeviceMac- 如果某个时序里先触发
notifyContact() - 但语音侧还没收到
cmd.syncBtActiveDeviceMac - 这次同步会直接跳过,日志会打印
notifyContact: no active device
- 如果某个时序里先触发
Next Step
明天继续时,建议在当前基础上做这两件事:
-
给
notifyContact()增加幂等保护- 去重键建议:
macAddress + contactJson/hash
- 去重键建议:
-
收敛联系人同步触发时机
- 区分“连接事件”
- 区分“PBAP 下载完成事件”
- 避免同一份联系人重复发给语音侧
Resume Prompt
明天可直接输入:
按 codex_xugong.md 继续,基于当前未提交代码继续处理蓝牙联系人同步去重