Android Wifi掃瞄的部分區分成被動掃描與主動掃描:
主動掃瞄:每隔一段時間廣播發送probe request的請求,在各個頻段上詢問AP的訊息,若有收到回應,做紀錄,超時的話則換到下個頻段進行廣播。
被動掃瞄:不發送請求,因為是以省電為目的,因此是單純接收AP傳送的beacon,通過接收到的beacon以獲取AP列表。在Android的範疇又分為一般掃瞄與PNO掃瞄:
一般掃瞄:即為上方所提的掃瞄(WifiSettings和WifiConnectivityManager)。
PNO掃瞄:掃瞄週期相比於一般掃瞄長,只在特殊情況進行掃瞄,像是滅屏+不連接網路的情況下掃瞄(在WifiConntivityManager的模塊進行)。
主要進行的Android類為兩種:
WifiConnectivity 及 WifiSettings後續下發時皆為觸及WifiScanner,WifiConnectivity牽扯到的比較相似於手機本身的變化觸發的掃瞄,如螢幕亮暗。
WifiSettings觸發的掃瞄偏向於使用者進行某些動作觸發的掃瞄,如開關WIFI掃瞄功能等等。
最後,因為工作需要,這次做了一個簡單的追蹤WIFI主動掃描下發的其中一個流程,從上層至底層:APP -> Framework ->底層 hal。
- 主要追蹤的過程是從WifiSetting觸發掃描時開始運作
- 接續到BaseWifiTracker -> WifiPickerTracker -> WifiManager(此處皆屬於Application層)
- 從WifiManager -> WifiService的過程需要經過AIDL進程
- 接著Service的部分從startScan()的API依序調用到Framework層的結尾,即是WifiNative。(Framework層)
- 後續從WifiNative之後開始皆為hal層的範圍,因此程式語言改為C++/C

以上是關於本次的紀錄。