近来在项目出现了个奇怪的bug,就是通过auidotrack写入音频播放时出现卡顿现象(一段时间的静音段或者噪音)然后开始分析问题原因
audiotrack播放卡顿分析
通过write方法向初始化audiotarck申请的共享内存里写入数据,auidofinger持续从共享内存里获取数据,这里有个参数需要注意是在write方法里有个参数writeMode默认设置成阻塞的,也就是内存中写满数据,audiofinger没有及时消费这些数据时,write方法会出现阻塞导致播报卡顿
bug修复方案
通过日志交叉分析,write方法调用确实有阻塞超过4秒的情况发生,但是无法确定问题根因就是这个,然后提供两种修改方式,第一增大初始化是申请的缓存空间,第二就是把write参数修改为非阻塞(write方法一次写满内存空间返回写入长度不阻塞),修改完成投入测试问题发生概率降低了,但是还是会发生,简直头大又接着拿到日志分析
Bug分析继续
从修改方式上看不应该再发生卡顿的现象,但是确实实在在发生了,这时候就怀疑卡顿不是发生write过程,然后结合日志和代码进行分析,发现代码中用到了锁,且在多线程有共用。 通过日志发现ReentrantLock发生了重入,且第二次锁没有及时释放,然后write方法所在的线程也用到了这个锁,这时就会发生卡顿 ,然后又修改针对锁的状态进行判断
修改完毕投入测试,这次就没出现了