天天看點

安卓源碼避坑指南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連接配接狀态位址為空值

繼續閱讀