天天看點

Android5.0L中SensorService crash導緻的systemserver重新開機問題分析

一、初步分析結論

sensorservice多線程機制存在問題,導緻在disable accel sensor并釋放相應記憶體和資料之後,

有很小的機率發生繼續讀取到未處理完的sensor事件,進而繼續使用相應的記憶體和資料,

并且沒有做相應的防禦保護措施,最終引起指針位址操作錯誤。

二、解決方案

1、首先在可能發生錯誤的地方做好防禦保護措施

2、對多線程進行同步,對于臨界變量的操作都放置到臨界區中,使用鎖來保護。

三、具體分析過程

log中顯示打出accel sensor被disable的資訊,然後接着1ms sensorservice就crash。

Android5.0L中SensorService crash導緻的systemserver重新開機問題分析

Disable accel sensor會先登出listener并釋放相應記憶體,然後再調用具體的sensor的hal去disable,具體代碼如下:

Android5.0L中SensorService crash導緻的systemserver重新開機問題分析

登出listener時會釋放記憶體和資料:

Android5.0L中SensorService crash導緻的systemserver重新開機問題分析

真正發生位址操作失敗的代碼并沒有進行相應的判空保護,如果781行得到的是0,那麼783的item也是0,它的成員ctx相對偏移是8,在對8進行尋址和成員操作時就出現了記憶體錯誤,因為8不是一個有效的資料對象位址,具體如下:

Android5.0L中SensorService crash導緻的systemserver重新開機問題分析
Android5.0L中SensorService crash導緻的systemserver重新開機問題分析

繼續閱讀