背景:
中控系统采用Android 9,原生蓝牙协议栈,IVI蓝牙音乐进度跳变,走秒不平滑
先说结论:
蓝牙协议栈中对HCI命令的处理任务和HCI LOG的存储任务处于同一个进程,当HCI LOG存储发生阻塞时,查询歌曲进度和解析歌曲进度的HCI命令处理任务也阻塞了,最终导致蓝牙音乐的歌曲进度变化不平滑。
原因分析:
罪魁祸首就是btsnoop.cc中的btsnoop_write_packet函数,其中有一行代码:
TEMP_FAILURE_RETRY(writev(logfile_fd, iov, 2));
宏定义TEMP_FAILURE_RETRY表示当传入的函数失败后,会不断重复执行,直到执行成功为止
,其在unistd.h的实现如下: