天天看点

安卓源码避坑指南8——上报profile连接状态地址为空值

上报协议连接状态地址为空值

安卓源码避坑指南8——上报profile连接状态地址为空值

安卓版本:android-9(P版本)

问题现象:上报a2dp-sink协议连接状态时,地址值为空导致蓝牙服务进程crash

安卓源码避坑指南8——上报profile连接状态地址为空值

既然是a2dp-sink的状态变化广播中的地址值为空,那问题肯定就出在a2dp-sink的状态机A2dpSinkStateMachine中。

全面分析完a2dp-sink的状态机中广播状态变化,只有如下场景下地址值可能为空值:

正在连接设备A个过程中,设备B直接连接成功了,则上报设备A的连接状态变化时会出现地址空值

安卓源码避坑指南8——上报profile连接状态地址为空值

设备B的地址值 device 是蓝牙协议栈底层上报到状态机中的,而设备A的地址值是状态机中保存的 mCurrentDevice。显而易见的是 mCurrentDevice 在当前这个场景下确实为空值,mTargetDevice 中才是保存的设备A的有效地址值。

对比logcat中的相关打印,这里上报mCurrentDevice确实为空值:

安卓源码避坑指南8——上报profile连接状态地址为空值

解决方案:上报设备A的连接状态广播时将地址值mCurrentDevice替换成mTargetDevice即可

安卓9中的a2dp-sink协议会出现这种空值引发crash的问题,最主要的原因还是状态机共用导致其复杂性提高,后续安卓版本或其他协议的状态机都是采用单独的状态机,一个地址值对应一个状态机,从而有效避免以上类似问题。

本次避坑指南就分享到这,感兴趣的小伙伴欢迎私信留言一起讨论,共同学习,一起进步!

更多互联互通技术,欢迎关注微信公众号:Connectivity

安卓源码避坑指南8——上报profile连接状态地址为空值

继续阅读